15.树的子结构

树的子结构
  • 参与人数:4088时间限制:1秒空间限制:32768K
  •  算法知识视频讲解

题目描述

输入两颗二叉树A,B,判断B是不是A的子结构。
做百度在线笔试的时候遇到了这道题,当时没有做出来,树的遍历一般用到递归,而这正是我的弱项,要加强练习!
/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    bool HasSubtree(TreeNode* p1, TreeNode* p2) {
        bool result = false ;
        
        if ( p1 != NULL && p2 != NULL ) {
            
            if ( p1->val == p2->val ) 
                result = isSubTree( p1, p2 ) ;
            
            if ( result == false ) 
                result = HasSubtree( p1->left, p2 ) ;
            
            if ( result == false ) 
                result = HasSubtree( p1->right, p2 ) ;
                
        }		
        return result ;
    }
    
    bool isSubTree( TreeNode* p1, TreeNode* p2 ) {
        if ( p2 == NULL ) {
            return true ;
        }
        
        if ( p1 == NULL )
            return false ;
        
        if ( p1->val != p2->val ) {
            return false ;
        }
        
        return ( isSubTree( p1->left, p2->left ) && isSubTree( p1->right, p2->right ) ) ;
    }
};
isSubTree是一个尾递归函数,尾递归先写好逻辑,在最后一步加入递归逻辑,算是比较简单的~
HasSubtree的判断我写成了
while (p1 != NULL && p2 != NULL)
........已经是递归了还做while循环,简直是作死。

你可能感兴趣的:(15.树的子结构)