一、題目描述:
二、解題思路(分三種情況):
1. 如果當前結點有右子樹
2. 如果當前節點沒有右子樹
(1) 如果當前節點是它父節點的左子節點
(2)如果當前節點是它父節點的右子節點
三、代碼實現:
1. 如果當前結點有右子樹
下一個節點就是它的右子樹的最左子節點(從右子節點出發一致沿着指向左子節點的指針,即可找到)
如:b ——》h, a——》f
2. 如果當前節點沒有右子樹
(1) 如果當前節點是它父節點的左子節點
下一個節點就是它的父節點
如:d——》b, f——》c, h——》e
(2)如果當前節點是它父節點的右子節點
沿着指向父節點的指針一直向上遍歷,直到找到一個是它父節點的左子節點的節點,如果這樣的節點存在,那麼這個節點的父節點就是我們要找到的下一個節點
如:i節點的下一個節點:沿着指向父節點的指針向上遍歷,先到e,e是b的右子節點,不是,繼續向上遍歷,到b, b是a的左子節點,因此節點b的父節點a就是i的下一個節點
如:g節點的下一個節點:沿着指向父節點的指針向上遍歷,先到c, c是a的右子節點,不是,繼續向上遍歷到a, a是根節點,無父節點,因此g沒有下一個節點。
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父
結點的指針。
鏈接:https://www.nowcoder.com/questionTerminal/9023a0c988684a53960365b889ceaf5e?f=discussion
來源:牛客網
public class Solution {
TreeLinkNode GetNext(TreeLinkNode node)
{
if(node==null) return null;
if(node.right!=null){ //如果有右子樹,則找右子樹的最左節點
node = node.right;
while(node.left!=null) node = node.left;
return node;
}
while(node.next!=null){ //沒右子樹,則找第一個當前節點是父節點左孩子的節點
if(node.next.left==node) return node.next;
node = node.next;
}
return null; //退到了根節點仍沒找到,則返回null
}
}