您的位置:首页 > Web前端

《剑指offer》-- 二叉树的下一个结点

2016-04-03 09:32 477 查看
题目描述:

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

解题思路:

/**

* 思路:

*

* 对于一个节点,其后续节点有三种形式:

* 1. 该节点的右指针为null,那么就往前找其父节点(设为a),

* 若a是其父节点的左子节点,那么下一个节点就是a的父节点,否则,就一直往上找,找到该节点为其父节点的左节点位置;

* 如果一直找到了跟节点(即其父节点为null),那么久返回null

* 2. 该节点是的右指针不为null,那么找其右子树的第一个节点

*

*/

本道题目不难,树遍历基本的三种方式,本道题的以上思路,可以综合在一个代码当中完成,也可以分功能到不同的函数内部,这是两种小细节的处理方式,我是使用的第二种,即在寻找右子树中序遍历下的第一个节点时,递归调用。

code:

/**
* 题目描述
*
* 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
*
* date: 2016.4.2   10:53
* @author SSS
*
*/
public class Solution {

public TreeLinkNode GetNext(TreeLinkNode pNode) {
TreeLinkNode resultNode  = null;

// 总体情况分为该节点右指针是否为0,若不为null,那么其下一个节点一定在右子树上,否则就要往上寻找
if (pNode.right != null) {
resultNode = getFirstNodeOfInOrder(pNode.right);

} else {    // 往上找
TreeLinkNode parentNode = pNode.next;
TreeLinkNode tempNode = pNode;
while(parentNode != null) {
if (parentNode.left == tempNode) {  // 该节点为父节点的左节点,那么父节点就是中序遍历的下一个节点
resultNode = parentNode;
break;
} else { // 否则就一直往上遍历
tempNode = parentNode;
parentNode = parentNode.next;
}
}
// 这种情况是一直遍历到整个树的根节点
if (parentNode == null) {
resultNode = null;
}

}

return resultNode;
}

/**
* 在中序遍历下,找到该节点的下一个节点,前提是当前节点是非空
* @param node
* @return
*/
public TreeLinkNode getFirstNodeOfInOrder(TreeLinkNode node) {
TreeLinkNode resultNode  = node;
if(node.left == null) {
return node;
}

resultNode = getFirstNodeOfInOrder(node.left);

return resultNode;
}
/*
public static void main(String []args) {

Solution solution = new Solution();

TreeLinkNode rootNode = new TreeLinkNode(4);
TreeLinkNode aNode = new TreeLinkNode(23);
TreeLinkNode bNode = new TreeLinkNode(12);
rootNode.left = aNode;
rootNode.right = bNode;
aNode.next = rootNode;
bNode.next = rootNode;

TreeLinkNode cNode = new TreeLinkNode(1);
TreeLinkNode dNode = new TreeLinkNode(65);
aNode.left = cNode;
aNode.right = dNode;
cNode.next = aNode;
dNode.next = aNode;

TreeLinkNode eNode = new TreeLinkNode(234);
TreeLinkNode fNode = new TreeLinkNode(64);
bNode.left = eNode;
bNode.right = fNode;
eNode.next = bNode;
fNode.next = bNode;

TreeLinkNode resultNode = solution.GetNext(bNode);

if (resultNode != null) {
System.out.println(resultNode.val);
} else {
System.out.println("null");
}

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