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

    分析:

    问题是将给定的二叉树变换成令一种形式,这样的类型的问题。其模式是,将左子树变换成某种形式,右子树也变换成这样的形式,然后再与根结点按规定的方式连接起来,那么总体就变换完毕了。

    这个题我们就能够採用这样的形式。麻烦的地方就是在进行连接的时候。我们如果根为root,左子树变换后的根为root_left。右子树变换后的根为 root_right。那么连接的时候应该是root->right = root_left,再连接root_right的时候。应该是root_left所指向的一系列结点的最后一个结点和root_right连接。如果该结点为tail_left,那么就应该是tail_left->right = root_right。这样总体就连接好了。在详细连接的时候。可能要考虑某些结点为NULL的情况。

    //
    TreeNode *&link(TreeNode *&root)
    	{
    		if(root == NULL || root->left == NULL && root->right == NULL) 
    			return root;
    		TreeNode *root_left = NULL;
    		TreeNode *root_right = NULL;
    		root_left = link(root->left);
    		root_right = link(root->right);
    		if(root_left != NULL)
    		{
    			TreeNode *tail = root_left;
    			//find the last one of root->left.
    			while(tail->right) tail = tail->right;
    			tail->right = root_right;
    		}
    		else
    			root_left = root_right;
    		root->right = root_left;
    		root->left = NULL;
    		return root;
    	}
    	void flatten(TreeNode *root) {
    		if(root == NULL) return;
    		root = link(root);
    	}

    我们再换个思路,题目中提示我们这样的形式事实上是树的先根遍历的结果。那么我们回忆下基本先根遍历是怎么处理的,我们都是简单的将根结点的val值进行打印。如今如果能够用额外的空间,那么我们就能够将先根遍历中的根结点放到一个顺序容器中。然后将每一个结点连起来就是题目要求的了。可是题目的意思非常明显不希望这样做,但我们还是希望用这样的形式,那怎么办呢?事实上我们不难发现,转换后的树形式上就是个单链表。那么问题就转换成单链表的建立。
    void preVisit(TreeNode*& pre, TreeNode*root)
    	{
    		if(root == NULL)
    			return;
    		TreeNode *right = root->right;
    		TreeNode *left = root->left;
    		root->left = NULL;
    		if(pre == NULL)
    			pre = root;
    		else
    		{
    			pre->right = root;
    			pre = root;
    		}
    		if(left)
    			preVisit(pre, left);
    		if(right)
    			preVisit(pre, right);
    	}

    上面的代码就是典型的先根遍历的模板。仅仅是模板中的万能visit函数做了一点略微复杂的事情。

    void flatten(TreeNode* root)
    	{
    		if(root = NULL) return;
    		TreeNode *pre = NULL;
    		preVisit(pre, root);
    	}

    总结:还是重复前面文章中重复说过的。树的基本遍历的模式一定要熟记于胸,非常多衍生的问题都是能够套用模板的。

  • 相关阅读:
    BizTalk2010动手实验(二)第一个BizTalk应用
    基于NopCommerce的开源电商系统改造总结
    BizTalk动手实验(六)Orchestration开发
    BizTalk动手实验(三)BizTalk开发综合实验
    项目管理-自上而下还是自下而上的沟通?
    BizTalk 2013 Beta 新特性介绍
    自主开发与带兵打仗
    Word邮件合并IT男必备技能
    三年项目管理,三个阶段
    BizTalk动手实验(八)消息路由
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8451525.html
Copyright © 2011-2022 走看看