考查中序遍历。
1,如果有一个节点,有右子树,那么它的下一个节点就是它右子树的最左子节点。如果右子树没有没有左节点,那么就返回右子树的根节点。
2.如果一个节点,没有右子树,并且他是他父亲的左子节点,那么他的下一个节点就是父节点。
3.如果一个节点,没有右子树,而且他还是他父亲节点的右子树,那么就要找到他父节点,如果他父节点上该节点父节点的右子树那么继续往上遍历,如果有一个节点的饰他父节点左子树节点,那么直接返回这个父节点。
4.如果第三种情况,那么他没有一下父节点
public static class TreeNode{
String val ;
TreeNode left;
TreeNode right;
TreeNode parent;
TreeNode(TreeNode left,TreeNode right,String val){
this.left = left;
this.right = right;
this.parent = null;
this.val = val;
}
@Override
public String toString() {
return "TreeNode{" +
"val='" + val + '\'' +
'}';
}
}
前文没有写全,二刷来补全
package question8_二叉树的下一个节点;
import com.sun.org.apache.regexp.internal.RE;
/**
* @Classname Main
* @Description TODO
* @Date 2020/4/11 15:44
* @Created by mmz
*/
public class Main {
public static class TreeNode{
String val ;
TreeNode left;
TreeNode right;
TreeNode parent;
TreeNode(TreeNode left,TreeNode right,String val){
this.left = left;
this.right = right;
this.parent = null;
this.val = val;
}
@Override
public String toString() {
return "TreeNode{" +
"val='" + val + '\'' +
'}';
}
}
public static TreeNode Core(TreeNode treeNode){
if(treeNode == null){
return null;
}
if(treeNode.right!=null){
treeNode = treeNode.right;
while(treeNode.left != null){
treeNode = treeNode.left;
}
return treeNode;
}
while(treeNode.parent != null){
TreeNode root = treeNode.parent;
if(root.left == treeNode){
return root;
}
treeNode = treeNode.parent;
}
return null;
}
public static void main(String[] args) {
TreeNode f = new TreeNode(null,null,"f");
TreeNode g = new TreeNode(null,null,"g");
TreeNode h = new TreeNode(null,null,"h");
TreeNode i = new TreeNode(null,null,"i");
TreeNode d = new TreeNode(null,null,"d");
TreeNode e =new TreeNode(h,i,"e");
TreeNode b= new TreeNode(d,e,"b");
TreeNode c = new TreeNode(f,g,"c");
TreeNode a = new TreeNode(b,c,"a");
h.parent = e;
i.parent = e;
d.parent =b;
e.parent= b;
f.parent =c;
g.parent= c;
b.parent = a;
c.parent = a;
System.out.println(Core(g));
}
}
一开始进行root边界判断。
如果当前节点有右子树,那么下一个节点就是当前节点的最左节点。
如无,进行判断,找到父节点的左节点是当前节点,那么就返回他的父节点。
如果一直没有,那么就不存在他的下一个节点,他就是中序遍历的最后一个节点。
中序遍历,先左在根最后右。