剑指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 }
时间: 2024-08-06 20:03:50

剑指Offer16 判断子树的相关文章

反转链表-剑指offer-16

题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 分析: 逐个头插,实现反转 设置3个指针:head 头节点.prev 前一个节点. cur 下一个节点 注意:链表为空,或者只有一个节点的情况! 代码: #include<iostream> using  namespace std; struct ListNode{ int val; ListNode *next; ListNode(int x) :val(x), next(nullptr){} }; class

[剑指offer] 判断二叉搜索树的后序遍历序列

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入描述 整数数组 输出描述 布尔值 题目分析 什么是二叉搜索树? 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二

[剑指offer] 判断栈的弹出序列

题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 输入描述 压入序列 输出描述 判断是否为出栈序列的boolean值 题目分析 解法一 运行时间:26ms 占用内存:629k public class Solution { public boolean IsPopOrder

剑指offer16 反转链表

错误代码 class Solution { public: ListNode* ReverseList(ListNode* pHead) { if(pHead == NULL) return NULL; ListNode* p1 = pHead; ListNode* p2 = pHead->next; ListNode* p3 = pHead->next->next; pHead->next = NULL; while(p3 != NULL){ p2->next = p1;

剑指offer16

package jianzhiOffer; /**  * 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需  * 要合成后的链表满足单调不减规则.  * @author user  *   */ public class ch16 { /*  * 思路一:采用递归的方式,很简单,先合并头结点,得出合并后  * 的头结点,再得到剩下的链表合并后的头结点,以此类推  */ public ListNode Merge(ListNode list1,ListNode list2) { Lis

剑指Offer - 判断数组中是否有一个数出现次数多于一半

https://www.nowcoder.net/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}

剑指offer——判断链表中是否有环

题目链接:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 解题思路: //左神讲的 //先说个定理:两个指针一个fast.一个slow同时从一个链表的头部出发 //fast一次走2步,slow一次走一步,如果该链表有环,两个指针必然在环内相遇 //此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内), //这次两个指针一次走一步,相遇的地方就是入口节点. //这个定理可以自己去网上看看证明. 1 /* 2 public class ListNode {

剑指Offer-16:合并两个有序链表

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 例如A链表为1-3-5-7,B链表为2-4-6-8.所以合并后的新链表C为1-2-3-4-5-6-7-8 节点定义如下: public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } 思路:利用递归 public ListNode Merge(ListNode li

剑指Offer-16.合并两个排序的链表(C++/Java)

题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 分析: 可以用一个新的节点,来去比较两个单调递增的链表当前节点的值,如果p1当前的值小于p2,则新的节点的next=p1,p1移到下一个节点,新的节点p也要移动到下一个节点. 当然也可以用递归来做.C++常规做法,Java递归实现. 程序: C++ class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead