二叉树的前序遍历(leetcode简单)+另一棵树的子树(leetcode简单)+二叉树遍历(牛客较难)

再更新三个关于二叉树的基础题

572. 另一棵树的子树

 思路:

这个题的难点就在于想到要将原树的所有节点都看作一个字数的根节点然后和subroot比较,简单点来说就是将root中所有的子树和subroot比较,树的相等要用上一篇中更新的是否是相同的树来判断,将issametree置前,然后开始写issubtree

如果root节点为空,那么必然是false,接下里就要看是否第一个根节点形成的树就和subroot相等,也就是root和subroot是一样的,如果不一样那么就要开始递归,左右都要递归,然后只要找到一颗一样的子树,就返回true。

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    if(p==NULL&&q==NULL)
    return true;
 
    if(p==NULL&&q!=NULL)
    return false;
 
    if(q==NULL&&p!=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)
    return false;
    //遍历,和root中所有的子树都比较一遍
    if(isSameTree(root,subRoot))
    return true;
    return isSubtree(root->left,subRoot)||
    isSubtree(root->right,subRoot);
}

144. 二叉树的前序遍历

 思路:

这个题前序遍历其实思想还是原来的思想,只不过要输出前序遍历读到的数字,而且要注意preorder中的传参要传指针,不能只传i,

int TreeSize(struct TreeNode*root)
{
    return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
}
void preorder(struct TreeNode* root,int *a,int* pi)
{
    if(root==NULL)
    return ;

    a[(*pi)++]=root->val;
    preorder(root->left,a,pi);
    preorder(root->right,a,pi);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize=TreeSize(root);

    int *a=(int*)malloc(*returnSize*sizeof(int));
    int i=0;

    preorder(root,a,&i);
    return a;
}

二叉树遍历_牛客题霸_牛客网

 思路:

这个题其实就是用前序遍历建好二叉树,然后用中序遍历输出结果,比如:

输入:

abc##de#g##f###

输出:

c b e g d f a 

 这就是建好的二叉树,然后按照中序的话就是左,根,右输出

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef char BTDataType;
typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
	BTDataType data;
}BTNode;

BTNode* BuyNode(BTDataType x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	assert(node);
	node->data = x;
	node->left = NULL;
	node->right = NULL;
	return node;
}
BTNode*CreateTree(char* str,int *pi)
{
    if(str[*pi]=='#')
    {
        (*pi)++;
        return NULL;
    }
    BTNode*root=BuyNode(str[(*pi)++]);
    root->left=CreateTree(str,pi);
    root->right=CreateTree(str,pi);
    return root;
}
void InOrder(BTNode*root)
{
    if(root==NULL)
        return;
    InOrder(root->left);
    printf("%c ",root->data);
    InOrder(root->right);
}
int main()
{
    char str[100];
    scanf("%s",str);
    int i=0;
    BTNode*root=CreateTree(str, &i);
    InOrder(root);
    return 0;
}

 上面这个两个题都涉及到了遍历,所以一定要注意这里对于i是取地址,而不是直接传i

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何以过春秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值