给出二叉树,以及一个节点 ,按照 中序遍历 找出其下一个节点
1.首先要理解中序遍历。
中序遍历是对于二叉树按照先左节点,然后 根节点,再 右节点的顺序进行排序
所以 对于其给定的节点 ,要考虑它现在的所处位置
2.对于不同位置进行处理
1.如果其有右节点,那么 其有右节点为其下一个节点
2.如果没有右子节点,那么 a.如果它是其父节点的左节点,那么其父节点就是下一个节点 b. 若不是,则往上回溯,找到一个父节点 假设为a, a为其父节点的左子树节点 ,那么 a的父节点则是 下一个节点(非常重要!!!)
代码实现
/**
*
*/
/***
* @author 18071
* @Date 2019年2月19日
* 功能:给出二叉树,以及一个节点 ,找出其下一个节点 中序遍历
* 先 左,后 根,再右
***/
public class text {
static TreeNode tnode =new TreeNode ("a");
public static void main(String args[]) {
TreeNode left=tnode.addleft("b");
left.addright("e");
left.addleft("d");
left.right.addleft("h");
TreeNode test=left.right.addright("i");
tnode.addright("c");
System.out.println(findnextnode(test).value);
}
public static TreeNode findnextnode(TreeNode head) {
TreeNode temp=null;
//分为 两种大的情况
// 有右子树 ,则下一个节点就是他的右节点
if(head.right!=null) {
temp=head.right;
System.out.println(1);
}
//若无右子树,若其不是其父节点的右子树,则 其父节点就是 其下一个节点
else if(head.parent!=null&&head.parent.left==head) {
temp= head.parent;
System.out.println(2);
}
///若无右子树,且是其父节点的右子树 则往上回溯,找到一个父节点 假设为a, a为其父节点的左子树节点 ,那么 a的父节点则是 下一个节点
else {
while(head.parent.parent.left!=head.parent&&head.parent!=null)
{
head=head.parent;
}
temp=head.parent.parent;
System.out.println(1);
}
return temp;
}
}
class TreeNode{
String value;
TreeNode left;
TreeNode right;
TreeNode parent;
TreeNode(String x){
this.value=x;
parent=null;
left=null;
left=null;
}
public TreeNode addleft(String a){
TreeNode t=new TreeNode(a);
this.left=t;
this.left.parent=this;
return left;
}
public TreeNode addright(String a) {
TreeNode t =new TreeNode(a);
this.right=t;
this.right.parent=this;
return right;
}
}
运行结果
要求找到i的下一个节点,应输出 a ,结果正确
节点e的下一个 节点,应为 i,结果正确
选择d,结果应为 b,正确