第十四期——另一棵树的子树 二叉树遍历

题目:另一棵树的子树

查看原题目请点击这里

给你两棵二叉树 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相同的子树,接下来的判断分为两步:

  1. 判断以root为根节点的树是否和subRoot结构相同,如果两棵树结构相同,返回true;
  2. 如果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;
}

持续更新下期见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值