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。

  • 相关阅读:
    [csp-201509-3]模板生成系统
    [csp-201403-3]命令行选项
    [csp-201809-4]再卖菜 差分约束or记忆化搜索
    [转]相互引用的结构体的定义
    【转】宏定义中#和##的使用
    Linux系统目录结构
    Linux sh脚本用spool导出oracle数据库指定表表数据
    关于./xhost: unable to open display问题的解决
    查新系统软硬信息
    文件用户及用户组归属修改
  • 原文地址:https://www.cnblogs.com/stemon/p/4708475.html
Copyright © 2011-2022 走看看