给定节点求该节点的后继节点

所谓后继节点就是该节点的下一个遍历的节点。比如某个树的中序遍历为:3,2,1,5,4。那么1的后继节点就是5,前驱节点就是2。我们这里使用中序遍历。


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.right == 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;
}

猜你喜欢

转载自blog.csdn.net/VanGotoBilibili/article/details/115052756