剑指Offer之 - 树的子结构

来源:互联网 发布:ios国外福利软件 编辑:程序博客网 时间:2024/04/28 13:27

题目:

输入两棵二叉树A和B,判断B是不是A的子结构。

思路:

先在A中找到一个结点的值和B的根结点值相同的结点,然后再判断以这个结点为根结点的数和树B是否相等(不是相等,而是B是否是A的子树)。

代码:

#include <iostream>using namespace std;struct BinaryTreeNode{int m_nValue;BinaryTreeNode *m_pLeft;BinaryTreeNode *m_pRight;BinaryTreeNode(){}BinaryTreeNode(int x):m_nValue(x),m_pLeft(NULL),m_pRight(NULL){}};//功能:判断数B是否是树A的子树//方法:先在A中找到一个结点的值和B的根结点值相同的结点,然后再判断以这个结点为根结点的数和树B是否相等(不是相等,而是B是否是A的子树)。bool DoesTree1HaveTree2(BinaryTreeNode *pRoot1 , BinaryTreeNode *pRoot2);bool HasSubtree(BinaryTreeNode *pRoot1 , BinaryTreeNode *pRoot2){if(pRoot1 == NULL || pRoot2 == NULL)return false;bool result = false;if(pRoot1->m_nValue == pRoot2->m_nValue)result = DoesTree1HaveTree2(pRoot1 , pRoot2);if(!result)result = HasSubtree(pRoot1->m_pLeft , pRoot2);if(!result)result = HasSubtree(pRoot1->m_pRight , pRoot2);return result;}bool DoesTree1HaveTree2(BinaryTreeNode *pRoot1 , BinaryTreeNode *pRoot2){//如果pRoot2到达叶结点,说明遍历完毕,说明它是A的子树,返回trueif(pRoot2 == NULL)return true;if(pRoot1 == NULL)return false;//bool result = false;if(pRoot1->m_nValue == pRoot2->m_nValue)return DoesTree1HaveTree2(pRoot1->m_pLeft , pRoot2->m_pLeft) && DoesTree1HaveTree2(pRoot1->m_pRight , pRoot2->m_pRight);elsereturn false;}int main(){BinaryTreeNode *node1 = new BinaryTreeNode(1);BinaryTreeNode *node2 = new BinaryTreeNode(2);BinaryTreeNode *node3 = new BinaryTreeNode(3);BinaryTreeNode *node4 = new BinaryTreeNode(4);node1->m_pLeft = node2;node1->m_pRight = node3;node3->m_pRight = node4;cout<<HasSubtree(node1 , node3)<<endl;return 0;}


0 0
原创粉丝点击