• 226_翻转二叉树


    226_翻转二叉树

    package 二叉树.BT;
    
    import java.util.LinkedList;
    import java.util.Queue;
    
    
    
    /**
     * https://leetcode-cn.com/problems/invert-binary-tree/
     * 题意,将所有结点进行左右结点数据进行交换(这里咱只需拿到所有结点即可~前序、中序、后序(递归)、层序(迭代)都可以拿到所有结点)
     * 
     * @author Huangyujun
     *
     */
    public class _226_翻转二叉树 {
        public class TreeNode {
            int val;
            TreeNode left;
            TreeNode right;
    
            TreeNode() {
            }
    
            TreeNode(int val) {
                this.val = val;
            }
    
            TreeNode(int val, TreeNode left, TreeNode right) {
                this.val = val;
                this.left = left;
                this.right = right;
            }
        }
        //前序遍历
        public TreeNode invertTree1(TreeNode root) {
            if(root == null)    return root;
            //前序遍历,首先拿到自己root[题意,交换当前结点的左右结点数据]
            TreeNode tmp = new TreeNode();
            tmp = root.left;
            root.left = root.right;
            root.right = tmp;
            
            invertTree(root.left);
            invertTree(root.right);
            return root;
        }
        // 中序遍历
        public TreeNode invertTree2(TreeNode root) {
            if (root == null)
                return root;
    
            invertTree(root.left);
            // 前序遍历,首先拿到自己root[题意,交换当前结点的左右结点数据]
            TreeNode tmp = new TreeNode();
            tmp = root.left;
            root.left = root.right;
            root.right = tmp;
            //这样写就出错了,没有很好理解递归的含义:再次 调用函数是为了递归进行找子结点(子树)
            //上面先 invertTree(root.left); 递归进左子树,然后进行交换,
            //(右子树的位置交换到左边了),若是还写invertTree(root.right); 又是一次递归进去左子树(重复了,而且还不给右子树机会)
    //        invertTree(root.right);
            //修改:
            invertTree(root.left);
            return root;
        }
        // 层序遍历
        public TreeNode invertTree(TreeNode root) {
            if (root == null)    return null;
            Queue queue = new LinkedList();
            queue.offer(root);
            // 只要队列不为空:就不断的出队,然后入队左右子节点
            while (!queue.isEmpty()) {
                TreeNode node =  (TreeNode) queue.poll();
                //拿到当前结点(进行交换左右结点)
                TreeNode tmp = new TreeNode();
                tmp = node.left;
                node.left = node.right;
                node.right = tmp;
    
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            return root;
        }
        
    }

    本文来自博客园,作者:一乐乐,转载请注明原文链接:https://www.cnblogs.com/shan333/p/15709239.html

  • 相关阅读:
    父类引用指向子类对象详解
    词尾的-sion和-tion的发音规则
    att&ack学习笔记6
    att&ack框架学习笔记5
    att&ack学习笔记4
    att&ck框架学习笔记3
    att&ck学习笔记2
    att&ck学习笔记1
    kerberos系列之spark认证配置
    kerberos系列之kerberos安装
  • 原文地址:https://www.cnblogs.com/shan333/p/15709239.html
Copyright © 2020-2023  润新知