Title description
Given a binary tree and one of its nodes, find the next node in the in-order traversal sequence and return. Note that the nodes in the tree not only include left and right child nodes, but also pointers to parent nodes.
Ideas
I have always understood the meaning of next in this topic and where does it point? Later, after reading other people's analysis, I understood. Next points to the parent node.
The following solution is not original:
Link: https://www.nowcoder.com/questionTerminal/9023a0c988684a53960365b889ceaf5e?f=discussion
Source: Niuke.com
- Analyzing the next node of the binary tree, there are the following situations:
- 1. If the binary tree is empty, return empty;
- 2. The right child nodes exist, a pointer is provided from the right child node, the last leaf node has to find a pointer to the left along the sub-node is the next node;
node 2 is started from the assumption,也就是说此时的中序遍历到了2这个节点。然后需要输出下一个节点
. The right child exists as 5, so start looking for his left child from 5. Then 3 is found, 3 has no left child, and 3 is returned. This means that 2 traversal in the middle order traversal, the next traversal output should be 3. - 3. The node is not the root node. If the node is the left child of its parent node, return the parent node; otherwise, continue to traverse the parent node of its parent node, repeat the previous judgment, and return the result.
Then we traversed to 3 at this time above. Then the node is the root node, the right child is 4, and there are no other nodes, it outputs 4, and then 4 is not the root node, it returns its parent node to 3, because 3 has been traversed at this time, it continues to return to it Parent node 5.
Code
/*
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)
{
if(pNode == null) return null;
TreeLinkNode res;
if(pNode.right == null){
//如果此时的结点没有右节点
res = pNode;
while(res.next != null && res.next.right == res){
//如果此时的节点不是作为自己的父节点的右节点,就一直向上遍历
res = res.next;
}
return res.next;
}
//如果此时的结点存在右节点,就一直沿着遍历其左结点,知道左节点为空,此时的节点就是下一个节点
res = pNode.right;
while(res.left != null){
res = res.left;
}
return res;
}
}