每日算法题【二叉树】:另一棵树的子树、二叉树的构建及遍历
(7)另一棵树的子树
-
572. 另一棵树的子树 - 力扣(LeetCode)
-
解题思路:
前序遍历每个节点进行(两颗子树是否相等)的比较
- 如果两棵二叉树的根节点都为空则认为是其子树
- 如果二叉树根节点为空,但是子树不为空,则一定不是其子树
- 如果两个根节点都不为空则通过
isSameTree
函数进行比较双方是否相同 - 不相同就继续递下去进行比较,只要有一个相同,就说明是其子树
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//两棵二叉树的根节点都为空则是相同的树if(p == NULL && q == NULL){//第一个递归结束条件return true;}//两棵二叉树的根节点有一个是空则证明为不相同的树if(p == NULL || q == NULL){//第二个递归结束条件return false;}//两棵二叉树的根节点都不为空且两个根节点不相同,则证明为不同的树if(p->val != q->val){//第三个递归结束条件return false;}return isSameTree(p->left,q->left) && isSameTree(p->right,q->right); }//前序遍历每个节点进行相同树函数比较 bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {//如果两棵二叉树的根节点都为空则认为是其子树if(root == NULL && subRoot == NULL){return true;}//如果二叉树根节点为空,但是子树不为空,则一定不是其子树if(root == NULL){return false;}//如果两个根节点都不为空则通过函数进行比较双方是否相同if(isSameTree(root,subRoot)== true){return true;}//不相同就继续递下去进行比较,只要有一个相同,就说明是其子树return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot); }
(8)二叉树的构建及遍历
-
二叉树遍历_牛客题霸_牛客网
-
解题思路:
其核心就是给定字符串然后用前序遍历数组来构建二叉树
#include <stdio.h> #include <stdlib.h>//二叉树节点结构体 typedef struct BTNode{char val;struct BTNode* left;struct BTNode* right; }BTNode;//前序遍历数组构建二叉树 BTNode* CreateTree(char* a, int* index) {//遇到空节点结束递归if (a[*index] == '#') {(*index)++;return NULL;}//遇到非空节点申请空间并将值放入到二叉树中BTNode* root = (BTNode*)malloc(sizeof(BTNode));root->val = a[(*index)++];root->left = CreateTree(a, index);root->right = CreateTree(a, index);//左右子树都构建完毕之后返回根节点return root; }//中序遍历函数 void inorder(struct BTNode* root){if(root == NULL){return;}inorder(root->left);printf("%c ",root->val);inorder(root->right); }int main() {//定义一个char*类型的数组来接收用户输入的字符串char a[100] = {0};int index = 0;scanf("%s", a);BTNode* ret = CreateTree(a,&index);if(ret == NULL){return 0;}inorder(ret);}