一、题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针
二、思路分析及代码实现
根据题意,我们很容易想到对二叉树进行中序查找,如果找到,则输出下一个节点,否则继续,直到最后。
import java.util.*;
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
public class Solution {
static ArrayList<TreeLinkNode> list=new ArrayList<>();
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
//根据next结点构建二叉树
TreeLinkNode cur=pNode;
while(cur.next!=null){
cur=cur.next;
}
//cur此时指向二叉树的根节点
Inorder(cur);
for(int i=0;i<list.size();i++){
if(list.get(i)==pNode)
return i==list.size()-1?null:list.get(i+1);
}
return null;
}
void Inorder(TreeLinkNode pRoot){
//左中右
if(pRoot!=null){
Inorder(pRoot.left);
list.add(pRoot);
Inorder(pRoot.right);
}
}
}
方法二:直接利用中序遍历特点来寻找下一个节点
因为中序遍历的顺序为:左根右,所以我们以当前节点的右节点是否为空来划分
- 若当前节点的右子树不为空,则当前节点的下一个节点为右子树的最左节点
- 若当前节点的右子树为空,
- 若当前节点为父节点的左子节点,则下一节点则为父节点
- 若当前节点为父节点的右子节点,则一直寻找父节点直到是某个父节点的左子树的一个节点。
import java.util.*;
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
TreeLinkNode cur=pNode;
if(pNode.right!=null){
// 若当前节点的右子树不为空,则当前节点的下一个节点为右子树的最左节点
pNode=pNode.right;
while(pNode.left!=null){
pNode=pNode.left;
}
return pNode;
}
if(pNode.next!=null&&pNode.next.left==pNode){
//若当前节点为父节点的左子节点,则下一节点则为父节点
return pNode.next;
}
if(pNode.next!=null){
//若当前节点为父节点的右子节点,则一直寻找父节点直到是某个父节点的左子树的一个节点。
pNode=pNode.next;
while(pNode.next!=null&&pNode.next.left!=pNode){
pNode=pNode.next;
}
return pNode.next;
}
return null;
}
}```