您的位置:首页 > Web前端

剑指offer_二叉树---二叉树的下一节点

2017-08-21 11:17 267 查看

题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

解题思路

1,因为是中序遍历,顺序为左—中—-右

2,因为考虑下一个节点,所以考察范围可以缩小到中和右

3,如果当前节点有右子树,那么下一个节点就是右子树的最左节点

4,如果当前节点没有右子树,且是父节点的左子节点,则下一个节点就是自己的父节点

5,如果当前节点没有右子树,且是父节点的右子节点,则向上找到第一个是其父节点左子节点的节点,下一个节点就是该父节点

代码

/**
*
*/
package offerTest;

/**
* <p>
* Title:Next
* </p>
* <p>
* Description:
* </p>
*
* @author 田茂林
* @data 2017年8月21日 上午10:34:53
*/
class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;

TreeLinkNode(int val) {
this.val = val;
}
}

public class Next {
public TreeLinkNode GetNext(TreeLinkNode pNode) {
if (pNode == null) {
return null;
}
// 如果当前节点有右子树
if (pNode.right != null) {
TreeLinkNode p = pNode.right;
while (p.left != null) {
p = p.left;
}
return p;
} else { // 如果当前节点没有右子树,且是父节点的左子节点
if (pNode.next != null) {

TreeLinkNode pcur = pNode;
TreeLinkNode parent = pcur.next;
if (parent != null && pcur == parent.left) { 如果当前节点没有右子树,且是父节点的左子节点,则下一个节点就是自己的父节点
return parent;
}
while (parent != null && pcur == parent.right) {如果当前节点没有右子树,且是父节点的右子节点,则向上找到第一个是其父节点左子节点的节点,下一个节点就是该父节点
pcur = parent;
parent = pcur.next;
}
return parent;

}
}
return null;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: