题目:给定一个二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了左右子节点外,还包含父节点。
思路:
节点分为有右子树和没有右子树两大类:
-
如果节点有右子树,那么它的下一个节点为它右子树的最左节点
-
如果节点没有右子树,也可以分为两类:(代码中可以统一处理)
(a)它是父节点的左孩子,那么它的下一个节点就是它的父节点
(b)它是父节点的右孩子,那就要从下往上遍历,找它父节点的父节 点的父节点…直到当前节点是父节点左孩子的节点,那么它的下一个节点就是这个节点的父节点。
测试用例:
功能测试:普通二叉树(完全二叉树、非完全二叉树)、不同位置的节点。
边界测试:特殊二叉树(所有节点都没有右子节点的二叉树、所有节点都没有左子节点的二叉树、只有一个节点的二叉树)
负面测试:二叉树的根节点指针为空。
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val){
this.val = val;
}
}
public class test_eight {
TreeLinkNode GetNode(TreeLinkNode node){
if(node == null)return null;
if(node.right != null){ //当节点有右子树时
node = node.right;
while(node.left != null){
node = node.left;
}
return node;
}
while(node.next != null){ //节点没有右子树的情况(if...else)
if(node.next.left == node){
return node.next;
}else{
node = node.next;
}
}
return null;
}
}