题目:另一棵树的子树
给你两棵二叉树 root
和 subRoot
。检验 root
中是否包含和 subRoot
具有相同结构和节点值的子树。如果存在,返回 true
;否则,返回 false
。
二叉树 tree
的一棵子树包括 tree
的某个节点和这个节点的所有后代节点。tree
也可以看做它自身的一棵子树。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
}
思路
如果想要判断root中是否包含和subRoot结构相同的子树,如果root==NULL,返回false,即以root为根节点的树不包含与subRoot相同的子树,接下来的判断分为两步:
- 判断以root为根节点的树是否和subRoot结构相同,如果两棵树结构相同,返回true;
- 如果1不成立,则判断以root->left为根节点的子树或者以root->right为根节点的子树是否包含和subRoot结构相同的子树。
在第十三期中,已经提供了关于如何判断两棵树是否是相同的树的思路,这里直接用上一期提供的代码。
代码(C语言版)
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
if(q==NULL&&p==NULL)
return true;
if(q==NULL&&p!=NULL)
return false;
if(q!=NULL&&p==NULL)
return false;
if(q->val!=p->val)
return false;
return isSameTree(q->left,p->left)&&isSameTree(q->right,p->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
if(root==NULL)
return false;
if(isSameTree(root,subRoot))
return true;
return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}
题目:二叉树遍历
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:输入包括1行字符串,长度不超过100。
输出描述:可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。
输入:abc##de#g##f###
输出:c b e g d f a
思路
整体思路是先读取字符串并放在数组中,然后根据数组中的元素还原二叉树,再用中序遍历输出。
因为前序遍历的顺序是根、左子树、右子树,所以当我们从数组中读取元素的时候,将先读到的元素放在root->val,然后再将读取的元素放在root的左孩子节点,最后再将读取的元素放在root的右孩子节点。而当我们读到‘#’时,返回空指针即可。
代码(C语言版)
#include <stdio.h>
#include<stdlib.h>
typedef struct BTNode
{
char val;
struct BTNode*left;
struct BTNode* right;
}BTNode;
BTNode* TreeCreat(char* a,int* pi)
{
if(a[*pi]=='#')
{
(*pi)++;
return NULL;
}
BTNode* node=(BTNode*)malloc(sizeof(BTNode));
node->val=a[*pi];
(*pi)++;
node->left=TreeCreat(a, pi);
node->right=TreeCreat(a, pi);
return node;
}
void Inorder(BTNode* root)
{
if(root==NULL)
return;
Inorder(root->left);
printf("%c ",root->val);
Inorder(root->right);
}
int main() {
char a[100];
scanf("%s",a);
int i=0;
BTNode* root=TreeCreat(a,&i);
Inorder(root);
return 0;
}
持续更新下期见