8.二分木の次のノード

剣はオファー08二分木の次のノードを指します

二分木とそのノードの1つが与えられた場合、順序どおりの走査シーケンスで次のノードを見つけて戻ります。ツリー内のノードには、左右の子ノードだけでなく、親ノードへのポインタも含まれることに注意してください。

public class TreeLinkNode {
    
    
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null; // 指向父结点的指针

    TreeLinkNode(int val) {
    
    
        this.val = val;
    }
}

問題解決のアイデア:中次走査の特性に基づいた思考

二分木が次の図のようになっているとします。
ここに画像の説明を挿入

  1. ノードに右の子がある場合、次のノードはその右の子の左のサブツリーの左端のノードです(2ノードなど、次のノードは3ノードです)
  2. ノードに正しい子がありません
    • ノードは親ノードの左の子であり、次のノードはその親ノードです(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;
    }
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/YouMing_Li/article/details/114253918