【题目】
/**在二叉树中找到一个节点的后继节点
* 【题目】
* 现在有一种新的二叉树节点类型如下
* public class Node {
* public int vaule;
* public Node left;
* public Node right;
* public Node parent;
*
* public Node(int vaule){
* this.value = value;
* }
* }
* 该结构比普通二叉树节点多了一个指向父节点的parent指针
* 假设有一颗Node类型节点组成的二叉树,
* 树中每个节点的parent指针都正确指向自己的父节点,
* 头节点的parent指向null
* 找到按中序遍历时的后继节点
*/
【思路】
这题是要求中序遍历
利用递归,对每节点来说,只有2种情况,有右子树,没有右子树。
有右子树,则后继节点是右子树的最左的叶子节点
没有右子树,则需要向上回溯,直到某一个父节点的左子树节点,那么这个父节点就是该节点的后继节点,当然,如果该节点是最后一个结点,那么回溯道最后,应该是null。
这道题很简单,但是一定要理解二叉树的中序遍历,了解中序遍历的特性
private Node getSuccessor(Node head, Node node){
if (node.right != null){
return getMostLeftNode(node.right);
} else {
while (null != node.parent){
Node parent = node.parent;
if (parent.left == node){
return parent;
}
node = node.parent;
}
}
return null;
}
private Node getMostLeftNode(Node node){
if (node == null){
return node;
}
while ( null != node.left){
node = node.left;
}
return node;
}
测试代码
public class Code08_SuccessorNode {
public static class Node{
public int vaule;
public Node left;
public Node right;
public Node parent;
public Node(int vaule) {
this.vaule = vaule;
}
}
private static Node getSuccessorNode(Node head,Node node){
if (node.right != null){
return getMostLeftNode(node.right);
} else {
while (null != node.parent){
Node parent = node.parent;
if (parent.left == node){
return parent;
}
node = node.parent;
}
}
return null;
}
//获取最左侧节点
private static Node getMostLeftNode(Node node) {
if (node == null){
return node;
}
while ( null != node.left){
node = node.left;
}
return node;
}
public static void main(String[] args) {
Node node = new Node(1);
node.parent = null;
node.left = new Node(2);
node.left.parent = node;
node.right = new Node(3);
node.right.parent = node;
node.left.left = new Node(4);
node.left.left.parent = node.left;
node.left.right = new Node(5);
node.left.right.parent = node.left;
node.right.left = new Node(6);
node.right.left.parent = node.right;
node.right.right = new Node(7);
node.right.right.parent = node.right;
node.left.left.left = new Node(8);
node.left.left.left.parent = node.left.left;
node.left.left.right = new Node(9);
node.left.left.right.parent = node.left.left;
Node successorNode = getSuccessorNode(node, node);
System.out.println(successorNode.vaule);
}
}