zoukankan      html  css  js  c++  java
  • 114. Flatten Binary Tree to Linked List (Stack, Tree; DFS)

    Given a binary tree, flatten it to a linked list in-place.

    For example,
    Given

             1
            / 
           2   5
          /    
         3   4   6
    

    The flattened tree should look like:

       1
        
         2
          
           3
            
             4
              
               5
                
                 6
    

    法I:递归,前序遍历

    /**
     * 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:
        void flatten(TreeNode* root) {
            if(!root) return;
            else preOrderTraverse(root);
        }
        
        TreeNode* preOrderTraverse(TreeNode* root){
            TreeNode* rightHead = root->right; //save root->right
            TreeNode* tail;
            
            if(!root->left && !rightHead){
                return root;
            }
            if(root->left) { //have left child
                root->right = root->left;
                root->left = NULL;
                tail = preOrderTraverse(root->right);
                if(rightHead){ //have both left child and right child
                    tail->right = rightHead; //如果left==NULL, 这里就不能使用tail->right,所以得分开讨论有右子树情况 
                    tail = preOrderTraverse(rightHead);
                }
            }
            else{ //only have right child
                tail = preOrderTraverse(rightHead);
            }
            
            return tail;
        }
    };

     法II:迭代

    每次循环,找到左子树前序遍历的最后一个节点(即最右的叶子节点),把右节点作为它的右儿子,当前节点的右儿子置为左节点,左节点置为NULL。

    然后把当前节点挪到它的右儿子,进入下一次循环

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        void flatten(TreeNode *root) {
            if (root == NULL) return;
            TreeNode *cur = root, *tail = NULL;
            while (cur != NULL) {
                if (cur->left != NULL) {
                    tail = cur->left;
                    while (tail->right) tail = tail->right;
                    tail->right = cur->right;
                    cur->right = cur->left;
                    cur->left = NULL;
                }
                cur = cur->right;
            }
        }
    };
  • 相关阅读:
    豆瓣api-简单跨域演示
    MVC4 验证用户登录一个特性搞定
    IIS7.5 不能加载外部引用的第三方JS,CSS,img等一系列静态文件
    三合一网站后台密码重置
    anaconda安装 (开源的Python发行版本)
    通达信指标函数说明大全
    织梦CMS如何修改中英文模板的当前位置
    微信小程序上架需要增值电信业务经营许可证ICP?
    PS抠图玻璃杯227
    PS用通道工具人物头发抠图246
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4853621.html
Copyright © 2011-2022 走看看