题目:输入两个二叉树,判断树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。