(Java bezieht sich auf Angebot) symmetrischer Binärbaum

1. Fragenanalyse

Bitte implementieren Sie eine Funktion, um festzustellen, ob ein Binärbaum symmetrisch ist. Beachten Sie, dass ein Binärbaum, der mit dem Spiegelbild dieses Binärbaums identisch ist, als symmetrisch definiert wird.

Zu beurteilen, ob ein Binärbaum symmetrisch ist, hauptsächlich um zu beurteilen, ob der linke Teilbaum und der rechte Teilbaum des Binärbaums symmetrisch sind.

(1) Wenn der Wurzelknoten des Binärbaums leer ist, erfüllt er die Bedingung.
(2) Beurteilen Sie rekursiv, ob der linke Knoten des linken Teilbaums des Binärbaums und der rechte Knoten des rechten Teilbaums sowie der rechte Knoten des linken Teilbaums und der linke Knoten des rechten Teilbaums gleich sind .

Zwei, rekursiver Code

class TreeNode {
    
    
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) 
    {
    
    
        this.val =val;
    }
}
public class Test_15 {
    
    

    boolean isSymmetrical(TreeNode pRoot) {
    
    
        //二叉树为空
        if (pRoot == null) {
    
    
            return true;
        }
        return isSymmetrical(pRoot.left, pRoot.right);
    }

    private boolean isSymmetrical(TreeNode left, TreeNode right) {
    
    
        //左右节点均为空
        if (left == null && right == null) {
    
    
            return true;
        }
        //左右节点有一个为空
        if (left == null || right == null) {
    
    
            return false;
        }
        //递归判断
        return left.val == right.val
                && isSymmetrical(left.left, right.right)
                && isSymmetrical(left.right, right.left);
    }
}

3. Nicht rekursiver Code: DFS-Tiefenüberquerung

DFS verwendet Stack zum Speichern von Knotenpaaren

(1) Wenn Sie den Stapel platzen lassen, muss er paarweise sein.
(2) Wenn alle leer sind, fahren Sie fort.
(3) Wenn einer leer ist, geben Sie false direkt zurück, andernfalls ist er nicht leer. Vergleichen Sie, ob der aktuelle Wert gleich ist.
(4) Jeder Stapel muss gepaart werden: der linke Knoten des linken Teilbaums und der rechte Knoten des rechten Teilbaums, der rechte Knoten des linken Teilbaums und der linke Knoten des rechten Teilbaums;

 boolean isSymmetricalDFS(TreeNode pRoot)
    {
    
    
        if(pRoot == null) return true;
        Stack<TreeNode> s = new Stack<>();
        s.push(pRoot.left);
        s.push(pRoot.right);
        while(!s.empty()) {
    
    
            TreeNode right = s.pop();//成对取出
            TreeNode left = s.pop();
            if(left == null && right == null) continue;
            if(left == null || right == null) return false;
            if(left.val != right.val) return false;
            //成对插入
            s.push(left.left);
            s.push(right.right);
            s.push(left.right);
            s.push(right.left);
        }
        return true;
    }

Viertens nicht rekursiver Code: BFS-Breitendurchlauf

BFS verwendet Queue zum Speichern von Knotenpaaren

(1) Paarweise abreisen
(2) Alle sind leer, urteilen weiter, eine Partei ist leer und gibt false zurück.
(3) Ebenso müssen Sie bei jedem Eintritt in das Team Folgendes koppeln: den linken Knoten des linken Teilbaums und den rechten Knoten des rechten Teilbaums; links; Der rechte Knoten des Teilbaums und der linke Knoten des rechten Teilbaums;

 boolean isSymmetricalBFS(TreeNode pRoot)
    {
    
    
        if(pRoot == null) return true;
        Queue<TreeNode> s = new LinkedList<>();
        s.offer(pRoot.left);
        s.offer(pRoot.right);
        while(!s.isEmpty()) {
    
    
            TreeNode left= s.poll();//成对取出
            TreeNode right= s.poll();
            if(left == null && right == null) continue;
            if(left == null || right == null) return false;
            if(left.val != right.val) return false;
            //成对插入
            s.offer(left.left);
            s.offer(right.right);
            s.offer(left.right);
            s.offer(right.left);
        }
        return true;
    }

Ich denke du magst

Origin blog.csdn.net/nanhuaibeian/article/details/108742442
Empfohlen
Rangfolge