面试题8:二叉树的下一个节点
题目要求:
给定二叉树和其中一个节点,找到中序遍历序列的下一个节点。树中的节点除了有左右孩子指针,还有一个指向父节点的指针。
数据结构与测试树:
//带有父指针的二叉树节点
class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode father;
public TreeNode(int val){
this.val = val;
this.left = null;
this.right = null;
this.father = null;
}
}
// 测试用例使用的树
// 1
// // \\
// 2 3
// // \\
// 4 5
// inorder : 42513
思路:
(1)如果输入的当前节点有右孩子,则它的下一个节点即为该右孩子为根节点的子树的最左边的节点,比如2->5,1->3
(2)如果输入的当前节点没有右孩子,就需要判断其与自身父节点的关系:
(2.1)如果当前节点没有父节点,那所求的下一个节点不存在,返回null.
(2.2)如果输入节点是他父节点的左孩子,那他的父节点就是所求的下一个节点,比如4->2
(2.3)如果输入节点是他父节点的右孩子,那就需要将输入节点的父节点作为新的当前节点,返回到(2),判断新的当前节点与他自身父节点的关系,比如5->1
代码:
public class P65_NextNodeInBinaryTrees {
public static TreeNode getNext(TreeNode pNode){
if(pNode==null)
return null;
else if(pNode.right!=null){
pNode = pNode.right;
while(pNode.left!=null)
pNode = pNode.left;
return pNode;
}
while(pNode.father!=null){
if(pNode.father.left==pNode)
return pNode.father;
pNode = pNode.father;
}
return null;
}
public static void main(String[] args){
// 1
// // \\
// 2 3
// // \\
// 4 5
// inorder->42513
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.left.father = root;
root.right = new TreeNode(3);
root.right.father = root;
root.left.left = new TreeNode(4);
root.left.left.father = root.left;
root.left.right = new TreeNode(5);
root.left.right.father = root.left;
System.out.println(getNext(root.left.left).val);
System.out.println(getNext(root.left).val);
System.out.println(getNext(root.left.right).val);
System.out.println(getNext(root).val);
System.out.println(getNext(root.right));
}
}
运行结果
2
5
1
3
null