1. 本题知识点
树
2. 题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回 。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
3. 解题思路
- 既然二叉树中的结点包含指向父结点的指针,那我们完全可以根据任意结点遍历得到二叉树的根节点
- 有了根节点,就可以对二叉树进行中序遍历
- 根据中序遍历结果找到给定结点的下一结点
注意:为了得到一个结点而遍历整个二叉树,这种方法的效率肯定是不高的,其实还有更优秀的算法。但这种算法理解起来还挺方便的,所以我就选择了这种算法。
4. 代码
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
import java.util.ArrayList;
import java.util.List;
public class Solution {
/**
* 给定一个二叉树和其中的一个结点,返回中序遍历顺序的下一个结点
* @param pNode 其中的一个结点
* @return
*/
public TreeLinkNode GetNext(TreeLinkNode pNode) {
// 找到根结点
TreeLinkNode root = pNode;
while (root.next != null) {
root = root.next;
}
// 创建一个集合,用来保存中序遍历二叉树的结果
ArrayList<TreeLinkNode> treeLinkNodes = new ArrayList<>();
// 中序遍历二叉树
InOrderTraverse(root, treeLinkNodes);
// 找到 pNode 在集合中的下标
int indexOfPNode = treeLinkNodes.indexOf(pNode);
// 如果 pNode 是最后一个结点,那么返回 null
if (indexOfPNode == treeLinkNodes.size() - 1) {
return null;
}
// 返回中序遍历顺序的下一个结点
return treeLinkNodes.get(indexOfPNode + 1);
}
// 二叉树的中序遍历递归算法
public void InOrderTraverse(TreeLinkNode T, List treeLinkNodes) {
if (T.left != null) {
InOrderTraverse(T.left, treeLinkNodes);
}
treeLinkNodes.add(T);
if (T.right != null) {
InOrderTraverse(T.right, treeLinkNodes);
}
}
}