再更新三个关于二叉树的基础题
思路:
这个题的难点就在于想到要将原树的所有节点都看作一个字数的根节点然后和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);
}
思路:
这个题前序遍历其实思想还是原来的思想,只不过要输出前序遍历读到的数字,而且要注意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