知识点/数据结构:二叉树
题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路
注意二叉树的节点的定义:树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
也就是三个属性;
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
这个是父亲节点的指针
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
所有的节点又如下几类:
1:节点有右子树,它的下一个节点就是它的右子树的最左子节点;
2:节点没有右子树,且它是父节点的左子节点,那么它的下一个节点就是它的父节点;
3:节点没有右子树,且它是父节点的右子节点,那么沿着指向父节点的指针向上遍历,直到找到一个是“它父节点的左子节点的节点”。
上代码:
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
//疑问?怎么表示右子树不为空node.right!=null
//当前节点的右子树,子树必须有左节点或者右节点不为空
if(pNode==null)return null;
if(pNode.right!=null)
{
pNode=pNode.right;
//这里是有循环的
//!!!!!!
while(pNode.left!=null)
{
pNode=pNode.left;
}return pNode;
}
while(pNode.next!=null)
{
if(pNode.next.left==pNode)return pNode.next;
pNode=pNode.next;
}
return null;
}
}