(Java se refiere a la oferta) árbol binario simétrico

1. Análisis de preguntas

Implemente una función para determinar si un árbol binario es simétrico. Tenga en cuenta que si un árbol binario es igual que la imagen reflejada de este árbol binario, defínalo como simétrico.

Para juzgar si un árbol binario es simétrico, principalmente para juzgar si el subárbol izquierdo y el subárbol derecho del árbol binario son simétricos.

(1) Si el nodo raíz del árbol binario está vacío, cumple la condición
(2) Juzgue recursivamente si el nodo izquierdo del subárbol izquierdo del árbol binario y el nodo derecho del subárbol derecho, y el nodo derecho del subárbol izquierdo y el nodo izquierdo del subárbol derecho son iguales .

Dos, código recursivo

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. Código no recursivo: cruce de profundidad DFS primero

DFS usa pila para almacenar pares de nodos

(1) Al abrir la pila, debe estar en pares.
(2) Si todos están vacíos, continúe
(3) Si uno está vacío, devuelva falso directamente, de lo contrario no está vacío. Compare si el valor actual es igual.
(4) Cada pila debe estar emparejada: el nodo izquierdo del subárbol izquierdo y el nodo derecho del subárbol derecho, el nodo derecho del subárbol izquierdo y el nodo izquierdo del subárbol derecho;

 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;
    }

Cuarto código no recursivo: recorrido BFS primero en amplitud

BFS usa Queue para almacenar pares de nodos

(1) Partir en parejas
(2) Todos están vacíos, seguir juzgando, una de las partes está vacía y devolver falso
(3) De manera similar, cada vez que ingresas al equipo, debes emparejar: el nodo izquierdo del subárbol izquierdo y el nodo derecho del subárbol derecho; izquierdo; El nodo derecho del subárbol y el nodo izquierdo del subárbol derecho;

 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;
    }

Supongo que te gusta

Origin blog.csdn.net/nanhuaibeian/article/details/108742442
Recomendado
Clasificación