zoukankan      html  css  js  c++  java
  • 【Leetcode】【Medium】Flatten Binary Tree to Linked List

    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

    解题思路:

    看上去很简单,使用二叉树的中序遍历就可以实现。但是题目的小曲点在于要在原tree上修改,如果将左儿子放在右儿子位置上,会丢失右子树,导致遍历失败。

    解决方法有两种:

    1、不使用多余空间,将右子树放在左子树中,最右边儿子的右儿子位置上,也正好满足了,leftchild -> data -> rightchild的中序顺序,但是缺点是要遍历多次树,时间复杂度高;

    2、只关注左儿子,将左儿子放到右儿子的位置上,同时使用栈结构,将所有右子树挨个入栈。在没有左儿子时,取出栈中元素。

    第二种解法的代码:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     void flatten(TreeNode* root) {
    13         stack<TreeNode*> rights;
    14         TreeNode* node = root;
    15         
    16         while (node != NULL) {
    17             while (node->left) {
    18                 if (node->right)
    19                     rights.push(node->right);
    20                 node->right = node->left;
    21                 node->left = NULL;
    22                 node = node->right;
    23             }
    24             
    25             if (node->right) {
    26                 node = node->right;
    27                 continue;
    28             }
    29             
    30             if (!rights.empty()) {
    31                 node->right = rights.top();
    32                 node = node->right;
    33                 rights.pop();
    34             } else {
    35                 break;
    36             }
    37         }
    38         
    39         return;
    40     }
    41 };
  • 相关阅读:
    关于控制地址控件的代码
    获取某个设计项列表界面上查询框中的值的代码
    js中不同值的替换
    js截取字符串方法实例
    抛异常语句的种类及区别
    从获取结果中去除重复记录
    泛微E8升级E9代码修改
    中控考勤数据转换
    WEB打印,分页首行自动带出栏目标题
    VS附加进程调试IIS网站
  • 原文地址:https://www.cnblogs.com/huxiao-tee/p/4518676.html
Copyright © 2011-2022 走看看