zoukankan      html  css  js  c++  java
  • 刷题114. Flatten Binary Tree to Linked List

    一、题目说明

    题目114. Flatten Binary Tree to Linked List,将一个二叉树“原地”压缩为“链表”形态的二叉树。难度为Medium!

    二、我的解答

    这个题目如果允许使用栈的话Easy,先序遍历二叉树,右子树入栈,左子树入栈。当栈不空的时候,将栈顶元素放到右子树即可。

    class Solution{
    	public:
    		void flatten(TreeNode* root){
    			
    			//先根遍历 
    			if(root==NULL) return;
    			if(root->left==NULL && root->right==NULL) return;
    			TreeNode *p,* cur = root;
    			
    			stack<TreeNode*> st;
    			if(root->right !=NULL){
    				st.push(root->right);
    			}
    			if(root->left !=NULL){
    				st.push(root->left);
    			}
    			
    			while(! st.empty()){
    				p = st.top();
    				st.pop();
    				cur->left = NULL;
    				cur->right = p;
    				cur = cur->right;
    				
    				if(cur->right !=NULL){
    					st.push(cur->right);
    				}
    				if(cur->left !=NULL){
    					st.push(cur->left);
    				}
    			}
    			
    			return; 
    		}
    };
    

    性能:

    Runtime: 12 ms, faster than 27.18% of C++ online submissions for Flatten Binary Tree to Linked List.
    Memory Usage: 11.6 MB, less than 8.33% of C++ online submissions for Flatten Binary Tree to Linked List.
    

    三、优化措施

    此处的“原地”,理解起来不能使用栈的。在这种情况下,将右子树作为左子树的最右下节点的右子树左子树变为右子树即可。

    class Solution{
    	public:
    		void flatten(TreeNode* root){
    			if(root==NULL) return;
    			if(root->left !=NULL){
    				TreeNode* pre = root->left;
    				while(pre->right !=NULL){
    					pre = pre->right;
    				}
    				pre->right = root->right;
    				root->right = root->left;
    				root->left = NULL;
    			}
    			flatten(root->right);
    			return; 
    		}
    };
    

    性能如下:

    Runtime: 4 ms, faster than 95.35% of C++ online submissions for Flatten Binary Tree to Linked List.
    Memory Usage: 11.3 MB, less than 8.33% of C++ online submissions for Flatten Binary Tree to Linked List.
    

    这个性能还一般,用morris方法(线索化二叉树),空间复杂度可以到O(1)。

    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    Android源码分析(二)-----如何编译修改后的framework资源文件
    Android源码分析(一)-----如何快速掌握Android编译文件
    AI2(App Inventor 2)离线版服务器网络版
    AI2(App Inventor 2)离线版服务器单机版
    AI2(App Inventor 2)离线版服务器(2019.04.28更新)
    解释器模式
    迭代器模式
    备忘录模式
    访问者模式
    命令模式
  • 原文地址:https://www.cnblogs.com/siweihz/p/12267743.html
Copyright © 2011-2022 走看看