题目描述
给定一个二叉树,树中节点的数据结构如下:
class TreeNode {
TreeNode left;
TreeNode right;
TreeNode father;
int val;
public TreeNode(int val){
this.val = val;
}
}
任给一个节点的值num(树中节点的值各不相同),输出该值对应的下一个中序遍历节点。
解题步骤
一、根据num用dfs遍历得到num对应的节点node
public TreeNode dfsFindVal(TreeNode root, int num){
if(root == null){
return null;
}
if(root.val == num){
return root;
}
if(dfsFindVal(root.left, num)!=null){
//如果在左子树中找到
return dfsFindVal(root.left, num);
}else {
return dfsFindVal(root.right, num);
}
}
二、根据node寻找它的下一节点
此时分四种情况:
- node有右子树,则node的下一个节点就是它的右子树中最左的节点;
- node没有右子树,且node没有父节点。则node的下一个节点为null;
- node没有右子树,且node是其父节点的左子节点。则node的下一个节点为其父节点;
- node没有右子树,且node是其父节点的右子节点,则依次往上遍历node的父节点,node的祖父节点。。。直到找到一个节点,该节点是其父节点的左子节点或该节点的父节点为null,则该节点的父节点为所求。
代码如下:
public TreeNode findNextNode(TreeNode node){
if(node == null){
return null;
}
//如果有右子树
if(node.right != null){
TreeNode tempNode = node.right;
while (tempNode.left != null){
tempNode = tempNode.left;
}
return tempNode;
}else{//如果没有右子树
//如果该节点的父节点为空
if(node.father == null){
return null;
}
//如果该点是其父节点的左子节点
if(node == node.father.left){
return node.father;
}else{//如果该节点是其父节点的右子节点
TreeNode tempNode = node.father;
while(tempNode.father != null && tempNode == tempNode.father.right){
tempNode = tempNode.father;
}
return tempNode.father;
}
}
}