栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二叉树的前序遍历(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
#include
#include
#include
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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928193.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号