• 如何找二叉树的后继结点


    二叉树的后继结点的定义:为该二叉树的中序遍历后,该节点后面一个结点即使该节点的后继结点。

    如图:中序遍历的结果是,4251637,所以 4的后继结点是2 ,2的后继结点是5

    package class_04;
    
    public class Code_03_SuccessorNode {
    
    	public static class Node {
    		public int value;
    		public Node left;
    		public Node right;
    		public Node parent;   // 添加一个后继结点
    
    		public Node(int data) {
    			this.value = data;
    		}
    	}
    
    	public static Node getSuccessorNode(Node node) {  // 找后继结点
    		if (node == null) {
    			return node;
    		}
    		if (node.right != null) {       // 如果有右子树,找到右子树上最左的结点
    			return getLeftMost(node.right);
    		} else {                    
    			Node parent = node.parent;  
    			while (parent != null && parent.left != node) {  // 往上找,直到“当前结点的父节点的左结点” 等于“当前结点”
    				node = parent;
    				parent = node.parent;
    			}
    			return parent;
    		}
    	}
    
    	public static Node getLeftMost(Node node) {  
    		if (node == null) {
    			return node;
    		}
    		while (node.left != null) {
    			node = node.left;
    		}
    		return node;
    	}
    
    	public static void main(String[] args) {
    		Node head = new Node(6);
    		head.parent = null;
    		head.left = new Node(3);
    		head.left.parent = head;
    		head.left.left = new Node(1);
    		head.left.left.parent = head.left;
    		head.left.left.right = new Node(2);
    		head.left.left.right.parent = head.left.left;
    		head.left.right = new Node(4);
    		head.left.right.parent = head.left;
    		head.left.right.right = new Node(5);
    		head.left.right.right.parent = head.left.right;
    		head.right = new Node(9);
    		head.right.parent = head;
    		head.right.left = new Node(8);
    		head.right.left.parent = head.right;
    		head.right.left.left = new Node(7);
    		head.right.left.left.parent = head.right.left;
    		head.right.right = new Node(10);
    		head.right.right.parent = head.right;
    
    		Node test = head.left.left;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.left.left.right;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.left;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.left.right;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.left.right.right;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.right.left.left;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.right.left;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.right;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.right.right; // 10's next is null
    		System.out.println(test.value + " next: " + getSuccessorNode(test));
    	}
    
    }
    

    左神的福利打印二叉树。

    package class_04;
    
    public class Code_03_SuccessorNode {
    
    	public static class Node {
    		public int value;
    		public Node left;
    		public Node right;
    		public Node parent;   // 添加一个后继结点
    
    		public Node(int data) {
    			this.value = data;
    		}
    	}
    
    	public static Node getSuccessorNode(Node node) {  // 找后继结点
    		if (node == null) {
    			return node;
    		}
    		if (node.right != null) {       // 如果有右子树,找到右子树上最左的结点
    			return getLeftMost(node.right);
    		} else {                    
    			Node parent = node.parent;  
    			while (parent != null && parent.left != node) {  // 往上找,直到“当前结点的父节点的左结点” 等于“当前结点”
    				node = parent;
    				parent = node.parent;
    			}
    			return parent;
    		}
    	}
    
    	public static Node getLeftMost(Node node) {  
    		if (node == null) {
    			return node;
    		}
    		while (node.left != null) {
    			node = node.left;
    		}
    		return node;
    	}
    
    	public static void main(String[] args) {
    		Node head = new Node(6);
    		head.parent = null;
    		head.left = new Node(3);
    		head.left.parent = head;
    		head.left.left = new Node(1);
    		head.left.left.parent = head.left;
    		head.left.left.right = new Node(2);
    		head.left.left.right.parent = head.left.left;
    		head.left.right = new Node(4);
    		head.left.right.parent = head.left;
    		head.left.right.right = new Node(5);
    		head.left.right.right.parent = head.left.right;
    		head.right = new Node(9);
    		head.right.parent = head;
    		head.right.left = new Node(8);
    		head.right.left.parent = head.right;
    		head.right.left.left = new Node(7);
    		head.right.left.left.parent = head.right.left;
    		head.right.right = new Node(10);
    		head.right.right.parent = head.right;
    
    		Node test = head.left.left;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.left.left.right;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.left;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.left.right;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.left.right.right;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.right.left.left;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.right.left;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.right;
    		System.out.println(test.value + " next: " + getSuccessorNode(test).value);
    		test = head.right.right; // 10's next is null
    		System.out.println(test.value + " next: " + getSuccessorNode(test));
    	}
    
    }
    
  • 相关阅读:
    JVM OOM处理
    Scala可变参数列表,命名参数和参数缺省
    Scala闭包
    Scala应用函数
    Scala函数字面量简化写法
    Scala函数字面量
    Scala中class和object的区别
    数据库的优化
    svn: warning: 'xxxxxx' is already under version control
    svn status 显示 ~xx
  • 原文地址:https://www.cnblogs.com/horken/p/10706132.html
Copyright © 2020-2023  润新知