zoukankan      html  css  js  c++  java
  • 树的子结构

    题目:输入两个二叉树,判断树B是不是树A的子结构

    树结点的定义:

    struct TreeNode
    {
    	int val;
    	struct TreeNode *left;
    	struct TreeNode *right;
    	TreeNode(int x) : val(x), left(NULL), right(NULL){}
    };
    

      像ListNode一样,都有一个构造函数。

    算法设计:

    不管怎样,这样的题目肯定都是要遍历二叉树的,这个问题可以采用先序的方式遍历二叉树。当A树的根结点和B树的根结点相同的时候,执行一系列的动作;当A树的根结点和B树的根结点不同的时候,接着往下遍历A,直到找到一个结点和B的根结点相同或者遍历完A树都没有找到。整个过程都是遍历A树,找到一个结点能够和B的根结点相同。

    当在A中找到了一个结点和B的根结点相同的时候,要执行一系列的动作。这一系列的动作就是校验A树和B树的每一个结点是否相同,这时候两棵树同时遍历。

    其实这个问题就是对A树和B树的两层遍历,外层只对A树遍历,内存对两棵树同时遍历。

    测试用例:

    两个普通的树A、B,且B是A的子结构

    两个普通的树A、B,但B不是A的子结构

    A、B都是单边的树

    A、B有一棵树为空

    代码实现:

    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
    	bool result = false;
    	
    	if(pRoot1 != NULL && pRoot2 != NULL)
    	{
    		if(pRoot1->val == pRoot2->val)
    		{
    			result = DoesTree1HaveTree2(pRoot1, pRoot2);
    		}
    		
    		if(!result)
    		{
    			result = HasSubtree(pRoot1->left, pRoot2);
    		}
    		if(!result)
    		{
    			result = HasSubtree(pRoot1->right, pRoot2);
    		}
    	}//if
    	
    	return result;
    }
    
    bool DoesTree1HaveTree2(TreeNode *pRoot1, TreeNode *pRoot2)
    {
    	if(pRoot2 == NULL)
    		return true;
    	if(pRoot1 == NULL)
    		return false;
    	
    	if(pRoot1->val != pRoot2->val)
    	{
    		return false;
    	}
    	
    	return DoesTree1HaveTree2(pRoot1->left, pRoot2->left) 
    		&& DoesTree1HaveTree2(pRoot1->right, pRoot2->right);
    }
    

      

    代码Debug。

  • 相关阅读:
    2190 ACM 数学概率论的乘法和加法原则
    2186 ACM 水题 int 向下取整
    2110 ACM Crisis of HDU 母函数
    2079 ACM 选课时间 背包 或 母函数
    2111 ACM 贪心 水题
    2108 ACM 向量积 凹凸
    My Web Developer Roadmap
    2109 ACM 排序
    2107 ACM 水题
    vi的常用命令
  • 原文地址:https://www.cnblogs.com/stemon/p/4708475.html
Copyright © 2011-2022 走看看