剣はオファー08二分木の次のノードを指します
二分木とそのノードの1つが与えられた場合、順序どおりの走査シーケンスで次のノードを見つけて戻ります。ツリー内のノードには、左右の子ノードだけでなく、親ノードへのポインタも含まれることに注意してください。
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null; // 指向父结点的指针
TreeLinkNode(int val) {
this.val = val;
}
}
問題解決のアイデア:中次走査の特性に基づいた思考
二分木が次の図のようになっているとします。
- ノードに右の子がある場合、次のノードはその右の子の左のサブツリーの左端のノードです(
2
ノードなど、次のノードは3
ノードです) - ノードに正しい子がありません
- ノードは親ノードの左の子であり、次のノードはその親ノードです(
1
ノードなど、次のノードは2
ノードです) - ノードが親ノードの右の子である場合、親ノードが親ノードの親ノードの左の子になるまで、親ノードを見つけるために上に移動し続け、次のノードは親ノードの親ノードになります(
3
ノードとして、ダウンノードは4
)、そのような親ノードはなく、次のノード(ノードなど9
)はありません
- ノードは親ノードの左の子であり、次のノードはその親ノードです(
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode father;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode inorderSuccessor(TreeNode p) {
if(p==null) return null;
if(p.right!=null){
//该节点有右孩子
p = p.right;
while(p.left!=null){
p = p.left;
}
return p;
}
//该节点是父节点的左孩子
if(p.father!=null && p.father.left == p) {
return p.father;
}
//该节点是父节点的右孩子
while(p.father!=null && p.father.right == p){
p = p.father;
}
return p.father;
}
}