树的子结构和树的深度

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

 1 #include<iostream>
 2 using namespace std;
 3
 4 typedef struct node
 5 {
 6 char data;//结点数据
 7 struct node *lchild,*rchild;//二叉树结点类型
 8 }BSTree;//二叉树结点类型
 9
10
11 void Createb(BSTree **p)//建立二叉树
12 {
13     char ch;
14     cin>>ch;
15     if(ch!=‘.‘)
16     {
17         *p=(BSTree*)malloc(sizeof(BSTree));//申请空间
18         (*p)->data=ch;//空间赋值
19         Createb(&(*p)->lchild);//生成左子树
20         Createb(&(*p)->rchild);//生成右子树
21     }
22     else *p=NULL;//空结点
23 }
24
25 bool DoesTree1HaveTree2(BSTree *root1,BSTree *root2)
26 {
27     if(root2==NULL)
28         return true;
29     if(root1==NULL)
30         return false;
31     if(root1->data!=root2->data)
32         return false;
33     return DoesTree1HaveTree2(root1->lchild,root2->lchild)&&34            DoesTree1HaveTree2(root1->rchild,root2->rchild);
35 }
36
37 bool HaveSubtree(BSTree *root1,BSTree *root2)//判断root2是否是root1的子结构
38 {
39     bool result=false;
40     if(root1!=NULL&&root2!=NULL)
41     {
42         if(root1->data==root2->data)
43             result=DoesTree1HaveTree2(root1,root2);
44         if(!result)
45             result= HaveSubtree(root1->lchild,root2);
46         if(!result)
47             result= HaveSubtree(root1->rchild,root2);
48     }
49     return result;
50 }
51 int TreeDepth(BSTree *root)//树的深度
52 {
53     if(root==NULL)
54         return 0;
55     int left=TreeDepth(root->lchild);
56     int right=TreeDepth(root->rchild);
57     return (left>right) ? (left+1) : (right+1);
58 }
59
60 void main()
61 {
62     BSTree *root1,*root2;//二叉树根指针
63     printf("create BSTree root1:\n");
64     Createb(&root1);//生成二叉树
65     printf("create BSTree root2:\n");
66     Createb(&root2);//生成二叉树
67     printf("root1‘s depth is:%d:\n",TreeDepth(root1));
68     printf("root2‘s depth is:%d:\n",TreeDepth(root2));
69     if(HaveSubtree(root1,root2))
70     printf("root2是root1的子结构!\n");
71     else
72     printf("root2不是root1的子结构!\n");
73 }

Code

打印结果:

时间: 2024-10-05 05:07:58

树的子结构和树的深度的相关文章

【剑指Offer】【树】树的子结构

题目:输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: bool isSubtree(TreeNode *pRoot1,TreeNode

【剑指offer】树的子结构

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25907685 剑指offer第18题,九度OJ上测试通过! 题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n,m(1<=n<=1000,1<=m<=1000):n代表将要输入的二叉树A的节点个数(节点从1开始计数),m代表将要输入的二叉树B的节点个数(节点从1开始计数).

剑指offer之树的子结构

题目: 树的子结构 链接: https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88?tpId=13&tqId=11170&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 分为两步: 第一步:

剑指 offer 树的子结构

题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 第一遍没写出来错误点:认为首先应该找到pRoot1等于pRoot2的节点,但是递归就是自己在不断递归中寻找相等的节点的.判断是否相等可以完全放到另外一个函数中进行判断.主函数主要就是看结果,比较相等可以完全放到另外一个函数中去. /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeN

树B是否为树A的子结构

bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){ if (pRoot1 == NULL) return false;//这一点很重要,要不然if (pRoot1->val == pRoot2->val)会报空指针的错误 if (pRoot2 == NULL) return false; bool res = false; if(pRoot1->val == pRoot2->val){ res = DoseTree1HasTre

代码的鲁棒性:树的子结构

输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 代码实现方式一: /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public boolean HasSubtree(TreeNode

找树节点在二叉树中的深度

/* *pRoot接收要检索的树的根节点,pNode是要确认深度的结点 path存储从根结点到pNode的所有节点,包括了pNode和根节点 */ void findPath(BinaryTreeNode *pRoot, BinaryTreeNode *pNode, vector<int> &path){ if (pRoot == NULL) return; path.push_back(pRoot->m_nValue); if (pRoot == pNode){ //找到了节点

剑指offer——树的子结构 (JAVA代码)

版权声明:本文为博主原创文章,未经博主允许不得转载. 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 解题思路: 首先看牛客网给出的测试用例: 一般对于树的操作不像链表一样,操作更复杂,如果使用循环遍历的话,对于非完全二叉树规律难寻,一般通用的方法就是使用递归求解,本题也不例外,同样使用递归求解,求解的大体思路是首先判断B的根节点和A的根节点是否相同(这里的相同是指节点的值相同并且左右子节点相同),如果相同比较他们的左右子节点,这一步骤是

《剑指Offer》题目:树的子结构

题目描述:树的子结构 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目分析:此题可以拆成两题,1.在二叉树中查找是否存在某个结点:2.判断两个二叉树是否有相同的结构 Java代码: class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } public class