剑指Offer16 判断子树

Posted Juntaran

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer16 判断子树相关的知识,希望对你有一定的参考价值。

  1 /*************************************************************************
  2     > File Name: 17_MirrorOfBinaryTree.cpp
  3     > Author: Juntaran
  4     > Mail: [email protected]
  5     > Created Time: 2016年08月30日 星期二 17时12分37秒
  6  ************************************************************************/
  7 
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 #include <malloc.h>
 11 #include <bits/stdc++.h>
 12 
 13 using namespace std;
 14 
 15 // 二叉树结构体
 16 struct TreeNode
 17 {
 18     int val;
 19     TreeNode* left;
 20     TreeNode* right;
 21 };
 22 
 23 TreeNode* createTree()
 24 {
 25     TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
 26     root->val = 8;
 27     root->left = (TreeNode*)malloc(sizeof(TreeNode));
 28     root->left->val = 8;
 29     root->right = (TreeNode*)malloc(sizeof(TreeNode));
 30     root->right->val = 7;
 31     root->right->left = NULL;
 32     root->right->right = NULL;
 33     root->left->left = (TreeNode*)malloc(sizeof(TreeNode));
 34     root->left->left->val = 9;
 35     root->left->left->left = NULL;
 36     root->left->left->right = NULL;
 37     root->left->right = (TreeNode*)malloc(sizeof(TreeNode));
 38     root->left->right->val = 2;
 39     root->left->right->left = (TreeNode*)malloc(sizeof(TreeNode));
 40     root->left->right->left->val = 4;
 41     root->left->right->left->left = NULL;
 42     root->left->right->left->right = NULL;
 43     root->left->right->right = (TreeNode*)malloc(sizeof(TreeNode));
 44     root->left->right->right->val = 7;
 45     root->left->right->right->left = NULL;
 46     root->left->right->right->right = NULL;
 47     
 48     return root;
 49 }
 50 
 51 TreeNode* createSubTree()
 52 {
 53     TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
 54     root->val = 8;
 55     root->left = (TreeNode*)malloc(sizeof(TreeNode));
 56     root->left->val = 9;
 57     root->right = (TreeNode*)malloc(sizeof(TreeNode));
 58     root->right->val = 2;
 59     root->left->left = NULL;
 60     root->left->right = NULL;
 61     root->right->left = NULL;
 62     root->right->right = NULL;
 63     
 64     return root;
 65 }
 66 
 67 bool DoesTree1HaveTree2(TreeNode* root1, TreeNode* root2)
 68 {
 69     if (root2 == NULL)
 70         return true;
 71     if (root1 == NULL)
 72         return false;
 73     if (root1->val != root2->val)
 74         return false;
 75     
 76     return DoesTree1HaveTree2(root1->left, root2->left) && DoesTree1HaveTree2(root1->right, root2->right);
 77 }
 78 
 79 bool hasSubTree(TreeNode* root1, TreeNode* root2)
 80 {
 81     int ret = false;
 82     if (root1!=NULL && root2!=NULL)
 83     {
 84         if (root1->val == root2->val)
 85             ret = DoesTree1HaveTree2(root1, root2);
 86         if (ret == false)
 87             ret = hasSubTree(root1->left, root2);
 88         if (ret == false)
 89             ret = hasSubTree(root1->right, root2);
 90     }
 91 }
 92 
 93 // 层序遍历二叉树
 94 void PrintTreeByLevel(TreeNode* root)
 95 {
 96     if (root == NULL)
 97         return;
 98     
 99     vector<TreeNode*> vec;
100     vec.push_back(root);
101     int cur = 0;
102     int last = 1;
103     
104     while (cur < vec.size())
105     {
106         last = vec.size();
107         while (cur < last)
108         {
109             printf("%d ", vec[cur]->val);
110             if (vec[cur]->left != NULL)
111                 vec.push_back(vec[cur]->left);
112             if (vec[cur]->right != NULL)
113                 vec.push_back(vec[cur]->right);
114             
115             ++ cur;
116         }
117         printf("\n");
118     }
119 }
120 
121 int main()
122 {
123     TreeNode* tree1 = createTree();
124     TreeNode* tree2 = createSubTree();
125     
126     PrintTreeByLevel(tree1);
127     printf("\n");
128     PrintTreeByLevel(tree2);
129     printf("\n");
130     
131     bool ret = hasSubTree(tree1, tree2);
132     if (ret == true)
133         printf("Yes\n");
134     else
135         printf("No\n");
136     
137     return 0;
138 }

 

以上是关于剑指Offer16 判断子树的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer树的子结构

剑指offer树的子结构python

Java 剑指offer(55-2) 平衡二叉树

剑指OFFER 平衡二叉树

剑指offer:平衡二叉树

剑指offer