目录
- 判断两棵二叉树是否相同
- 单值二叉树
- 判断对称二叉树
- 另一棵树的子树
- 二叉树遍历
- 判断完全二叉树
判断两棵二叉树是否相同
力扣上忽然找不到这个题了,大家先看代码吧:
首先要注意的是,两棵树的前序遍历结果一样时,结构可能是不同的。
但我们这个题可以用前序遍历的思想去做,即比较根、左子树、右子树是否分别相同即可。
bool isSameTree(BTNode* p,BTNode* q)
{if(p==NULL&&q!=NULL||p!=NULL&&q==NULL)return false;if(p==NULL&&q==NULL)return true;if(p->val!=q->val)return false;return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}
单值二叉树
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true;否则返回 false。
bool isUnivalTree(struct TreeNode* root)
{if(root==NULL)return true;if(root->left&&root->val!=root->left->val)return false; if(root->right&&root->val!=root->right->val)return false;bool ret1=isUnivalTree(root->left); bool ret2=isUnivalTree(root->right);return ret1&&ret2;
}
判断对称二叉树
bool _symmetric(struct TreeNode* p,struct TreeNode* q)
{if(p==NULL&&q!=NULL||p!=NULL&&q==NULL)return false;if(p==NULL&&q==NULL)return true;if(p->val!=q->val)return false;return _symmetric(p->left,q->right)&&_symmetric(p->right,q->left);
}
bool checkSymmetricTree(struct TreeNode* root) {if(root==NULL)return true;return _symmetric(root->left,root->right);
}
另一棵树的子树
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(p==NULL&&q!=NULL||p!=NULL&&q==NULL)return false;if(p==NULL&&q==NULL)return true;if(p->val!=q->val)return false;bool ret1=isSameTree(p->left,q->left);if(!ret1)return false;bool ret2=isSameTree(p->right,q->right);if(!ret2)return false;return true;
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){if(root==NULL)return false;if(root->val==subRoot->val&&isSameTree(root,subRoot))return true;return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}
二叉树遍历
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的先序遍历字符串:
ABC##DE#G##F###,其中#表示空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{char val;struct node*left;struct node*right;
}NODE;void InOrder(NODE* root)
{if(root==NULL)return;InOrder(root->left);printf("%c ",root->val);InOrder(root->right);
}
NODE* CreateTree(char* s, int* pi)
{if(s[*pi]=='#'){(*pi)++;return NULL;}NODE* root=(NODE*)malloc(sizeof(NODE));root->val=s[(*pi)++];root->left=CreateTree(s,pi);root->right=CreateTree(s,pi);return root;
}
int main()
{char s[50];scanf("%s",s);int i=0;NODE* root=CreateTree(s,&i);InOrder(root);return 0;
}
判断完全二叉树
#define MAX 100
NODE* queue[MAX];
int Front=0,Rear=MAX-1,Count=0;
bool TreeIsComplete(NODE* root)
{if(root){Rear=(Rear+1)%MAX;queue[Rear]=root;Count++;}while(Count!=0){NODE* head=queue[Front];Front=(Front+1)%MAX;if(head==NULL)break;Rear=(Rear+1)%MAX;queue[Rear]=root->left;Count++;Rear=(Rear+1)%MAX;queue[Rear]=root->right;Count++;}while(Count!=0){NODE* head=queue[Front];Front=(Front+1)%MAX;if(head)return false;}
}