反转二叉树 python 反转二叉树 leetcode_结点

 

 

方法一:循环,栈存储(DFS,非递归)

本质思想是,左右节点进行交换,循环翻转每个节点的左右子节点,将未翻转的子节点存入栈中,循环直到栈里所有节点都循环交换完为止。

方法二:循环,队列存储(BFS,非递归)

本质思想是,左右节点进行交换,循环翻转每个节点的左右子节点,将未翻转的子节点存入队列中,循环直到栈里所有节点都循环交换完为止。

  • 方法一、方法二伪代码:
1、判断根结点是否为空,为空则返回null;
2、新建栈(队列),用于节点存储,初始存入根节点到栈(队列)里;
3、while循环,栈(队列)为空时结束循环;
  i.出栈(队列)一个节点,将该节点的左右子节点交互;
  ii.判断左右子节点是否为null,非null则继续将左右节点入栈(队列);
4、循环交换结束,返回根节点;

方法三:递归

本质思想也是左右节点进行交换,交换前递归调用对根结点的左右节点分别进行处理,保证交换前左右节点已经翻转。

  • 方法三伪代码:
1、判断根结点是否为空,为空则返回null;
2、交换跟节点的左右节点;
3、递归交互左右子树;

栈实现

class Solution {
       public TreeNode invertTree(TreeNode root) {            
            if (root == null) {
                return null;
            }
            Stack<TreeNode> stack = new Stack<>();
            stack.push(root);            
            while(!stack.isEmpty()) {
                final TreeNode node = stack.pop();
                final TreeNode left = node.left;
                node.left = node.right;
                node.right = left;           
                if(node.left != null) {
                    stack.push(node.left);
                }
                if(node.right != null) {
                    stack.push(node.right);
                }
            }
            return root;
        }
}

队列实现

class Solution {
public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            TreeNode left = node.left;
            node.left = node.right;
            node.right = left;
            if (node.left != null) {
                queue.offer(node.left);
            }
            if (node.right != null) {
                queue.offer(node.right);
            }
        }
        return root;
    }
}

递归实现

class Solution {
      public TreeNode invertTree(TreeNode node) {
        if (node == null) {
            return null;
        }
        TreeNode temp = node.left;
        node.left = node.right;
        node.right = temp;
        invertTree(node.left);
        invertTree(node.right);
        return node;
    }
}