美文网首页
LeetCode—— 翻转二叉树

LeetCode—— 翻转二叉树

作者: Minority | 来源:发表于2020-02-10 14:55 被阅读0次

    题目描述

    翻转一棵二叉树。
    
    示例:
    
    输入:
    
         4
       /   \
      2     7
     / \   / \
    1   3 6   9
    输出:
    
         4
       /   \
      7     2
     / \   / \
    9   6 3   1
    
    一、CPP
    1. 递归法:

    解题思路:前序递归遍历树,对树的操作代码交换左右子树即可。
    时间复杂度:O(n)。每个元素都必须访问一次,n为元素个数。
    空间复杂度:O(h)。h为树的高度,最坏的情况下,需要存放O(h)个函数调用。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        TreeNode* invertTree(TreeNode* root) {
    
            
            if(root == NULL){
                return root;
            }
            
            TreeNode * tmp_node;
            
            //前序遍历交换左右子树
            tmp_node = root->left;
            root->left = root->right;
            root->right = tmp_node;
    
            invertTree(root->left);
            invertTree(root->right);        
    
            return root;
        }
    };
    
    2. 迭代法(层次遍历):

    解题思路:递归实现也就是深度优先遍历的方式,那么对应的就是广度优先遍历。广度优先遍历需要额外的数据结构--队列,来存放临时遍历到的元素。
    深度优先遍历的特点是一竿子插到底,不行了再退回来继续;而广度优先遍历的特点是层层扫荡。所以,我们需要先将根节点放入到队列中,然后不断的迭代队列中的元素。对当前元素调换其左右子树的位置,然后:

    • 判断其左子树是否为空,不为空就放入队列中
    • 判断其右子树是否为空,不为空就放入队列中

    时间复杂度:O(n),每个节点都需要入队列/出队列一次。
    空间复杂度:O(n),最坏的情况下会包含所有的叶子节点,完全二叉树叶子节点是n/2个。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        TreeNode* invertTree(TreeNode* root) {
    
            queue<TreeNode*> myqueue;
            TreeNode *r, *tmp_node;
    
            if(!root){
                return root;
            }
    
            myqueue.push(root);
    
            while(!myqueue.empty()){
                r = myqueue.front();
                myqueue.pop();
    
                tmp_node = r->left;
                r->left = r->right;
                r->right = tmp_node;
    
                if(r->left){
                    myqueue.push(r->left);
                }
    
                if(r->right){
                    myqueue.push(r->right);
                }
            }
    
            return root;
            
        }
    };
    

    参考自:图解算法

    二、Java(迭代法)
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public TreeNode invertTree(TreeNode root) {
    
            if(root == null){
                return root;
            }
    
            Queue<TreeNode> myqueue = new LinkedList<>();
            TreeNode tmp_node = new TreeNode(0);
            TreeNode r = new TreeNode(0);
    
            myqueue.offer(root);
    
            while(!myqueue.isEmpty()){
    
                r = myqueue.poll();
                tmp_node = r.left;
                r.left = r.right;
                r.right = tmp_node;
    
                if(r.left!=null){
                    myqueue.offer(r.left);
                }
    
                if(r.right!=null){
                    myqueue.offer(r.right);
                }
            }
    
            return root;
            
        } 
    }
    
    三、Python(迭代法)
    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def invertTree(self, root):
            """
            :type root: TreeNode
            :rtype: TreeNode
            """
            if root == None:
                return root
    
            myqueue = []
            myqueue.append(root)
    
            while len(myqueue):
                r = myqueue.pop(0)
    
                tmp_node = r.left
                r.left = r.right
                r.right = tmp_node
    
                if r.left:
                    myqueue.append(r.left)
                if r.right:
                    myqueue.append(r.right)
            return root
    
    四、各语言及算法时间复杂度

    相关文章

      网友评论

          本文标题:LeetCode—— 翻转二叉树

          本文链接:https://www.haomeiwen.com/subject/ygpaxhtx.html