• 刷题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)。

    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    2015年蓝桥杯省赛A组c++第3题
    2015年蓝桥杯省赛A组c++第1题
    算法学竞赛常用头文件模板
    Android+Tomcat通过http获取本机服务器资源
    Ubuntu16.04LTS卸载软件的命令
    20个有趣的Linux命令
    Ubuntu16.04开机蓝屏问题解决
    Ubuntu启动时a start job is running for dev-disk-by延时解决
    Cookie与Session
    JS 闭包
  • 原文地址:https://www.cnblogs.com/siweihz/p/12267743.html
Copyright © 2020-2023  润新知