前言
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
题目一:翻转二叉树
struct TreeNode* invertTree(struct TreeNode* root){
if(!root) return root;
else{
struct TreeNode* node = root->left;
root->left = root->right;
root->right = node;
root->left = invertTree(root->left);
root->right = invertTree(root->right);
return root;
}
}
struct TreeNode* swap(TreeNode* root){
if(root==NULL) return NULL;
TreeNode* left = swap(root->left);
TreeNode* right = swap(root->right);
root->left = right;
root->right = left;
return root;
}
}
题目二:相同的树
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
if(!p && !q) return true;
if(!p || !q) return false;
return p->val==q->val && isSameTree(p->left,q->left) && isSameTree(p->right, q->right);
}
题目三:对称二叉树
bool check(struct TreeNode* root1, struct TreeNode* root2){
if(!root1 && !root2) return true;
if(!root1 || !root2) return false;
if(root1->val != root2->val) return false;
return check(root1->left, root2->right) && check(root1->right, root2->left);
}
bool isSymmetric(struct TreeNode* root){
return check(root, root);
}
题目四:写出二叉树自下而上、从从右到左的层次遍历
void invertLevel(TreeNode* root){
Stack S;
Queue Q;
TreeNode *p = NULL;
if(root!=NULL){
InitStack(S);
InitQueue(Q);
EnQueue(Q, bt);
while(!Isempty(Q)){
DeQueue(Q, p);
push(S,p);
if(p->lchild)
EnQueue(Q, p->left);
if(p->right)
EnQueue(Q, p->right);
}
while(!isEmpty(s)){
Pop(S, p);
visis(p->data);
}
}
}
题目五:二叉树采用二叉链表存储,编程实现非递归算法求二叉树高度
int maxDepth(TreeNode* root){
if(root==NULL) return 0;
else{
TreeNode* p = NULL;
int i ,depth = 0;
EnQueue(Q, root);
while(!isEmpty(Q)){
depth++;
for(i=0; i<Q.size(); ++i){
DeQueue(Q, p);
if(p->left) EnQueue(Q, p->left);
if(p->right) EnQueue(Q, p->right);
}
}
return depth;
}
}
题目六:判断该二叉树是否为完全二叉树
bool isCompleteTree(TreeNode* root){
TreeNode* p;
InitQueue(Q);
EnQueue(Q, root);
while((p = DeQueue(Q))!=NULL){
EnQueue(Q, root->left);
EnQueue(Q, root->right);
}
while(!isEmpty(Q)){
p = DeQueue(Q);
if(p!=NULL) return false;
}
return true;
}
题目七:计算二叉树双分支结点个数
int DsonNodes(TreeNode* root){
if(root==NULL) return 0;
else{
if(root->left!=NULL && root->right!=NULL){
return 1 + DsonNodes(root->left) + DsonNodes(root->right);
}else{
return DsonNodes(root->left) + DsonNodes(root->right);
}
}
}
题目八:二叉链表存储二叉树,求先序遍历序列中第K个结点的值
int i=1;
ElemType preNode(TreeNode* root, int k){
if(root==NULL) return '#';
if(i=k) return root->data;
i++;
ElemType p = preNode(root->left, k);
if(p!='#') return p;
p = preNode(root->right, k);
return p;
}
题目九:二叉链表存储的二叉树,对于树中每个元素值为x的结点,删除以它为根的子树
void search(TreeNode* root, ElemType x){
if(root!=NULL){
if(root->data==x){
DeleteXTree(root);
return;
}else{
InitQueue(Q);
EnQueue(Q, root);
TreeNode* p = NULL;
while(!isEmpty(Q)){
DeQueue(Q, p);
if(p->left){
if(p->left->data==x){
DeleteXTree(p->left);
p->left = NULL;
}else EnQueue(Q, p->left);
}
if(p->right){
if(p->right->data==x){
DeleteXTree(p->right);
p->right = NULL;
}else EnQueue(Q, p->right);
}
}
}
}
}
题目十:计算二叉树高度
int hight(TreeNode* root){
if(root) return 0;
int lhight=hight(root->left);
int rhight=hight(root->right);
return (lhight>rhight?lhight:rhight)+1;
}
题目十一:计算二叉树宽度
int count[100];
int MAX=-1;
void findWidth(TreeNode* root, int k){
if(root==NULL) return;
count[k]++;
if(MAX<count[k]) MAX=count[k];
findWidth(root->left, k+1);
findWidth(root->right, k+1);
}
题目十二:找二叉树p和q分别指向的两个结点的最近公共祖先
TreeNode lowerCommonAncestor(TreeNode* root,TreeNode* p,TreeNode* q){
if(root==NULL) return NULL;
if(root==p || root==q) return root;
TreeNode* left = lowestCommonAncestor(root->left,p,q);
TreeNode* right = lowestCommonAncestor(root->right,p,q);
if(left!=NULL && right!=NULL) return root;
if(left==NULL && right==NULL) return NULL;
return left==NULL?right:left;
}
题目十三:二叉树先序遍历
void preTravel(TreeNode* root){
if(root!=NULL){
Stack s;
InItStack(s);
push(s, root);
TreeNode* p=NULL;
while(!isEmpty()){
p=pop(s);
Visit(p);
if(p->right!=NULL) push(s,p->right);
if(p->left!=NULL) push(s,p->left);
}
}
}
题目十四:二叉树中序遍历
void inorderTravel(TreeNode* root){
if(root!=NULL){
Stack s;
InItStack(s);
push(s);
while(root && isEmpty(s)!=NULL){
while(root){
push(s,root);
root=root->left;
}
root=pop(s);
visit(root);
root=root->right;
}
}
}
题目十五:二叉树后序遍历
void postTravel(TreeNode* root){
if(root!=NULL){
Stack s;
TreeNode* p;
int i=0,arr[100];
InItStack(s);
push(s,root);
while(!isEmpty(s)){
p=pop(s);
arr[i]=p->val;
if(p->left!=NULL) push(s, p->left);
if(p->right!=NULL) push(s, p->right);
}
reverse(arr);
}
}
题目十六:根据先序序列和中序建立该二叉树的二叉链表
TreeNode* preInCreat(ElemType A[],ElemType B[],int pre_start,int pre_end,int inorder_start,int inorder_end){
root=(TreeNode*)malloc(sizeof(TreeNode));
root->data=A[pre_start];
for(index=inorder_start; B[i]!=root->data; index++);
lLen=index-inorder_start;
rLen=inorder_end-index;
if(lLen)
root->left=preInCreat(A,B, pre_start+1, pre_start+rLen, inorder_start, inorder_start+lLen-1);
else
root->left=NULL;
if(rLen)
root->right=preInCreat(A,B, pre_end-rLen+1, pre_end, inorder_end-rlen+1, inorder_end);
else
root->right=NULL;
return root;
}
题目十七:满二叉树先序转后序
void preToPost(ElemType pre[],int pre_strart,int pre_end, ElemType post[],int post_start,int post_end){
int halfLen;
if(pre_end >= pre_end){
post[post_end] = pre[post_start];
halfLen = (pre_end - pre_start)/2;
preToPost(pre,pre+1,pre+halfLen, post, post_pre,post_pre+halfLen-1);
preToPosst(pre,pre+halfLen+1,pre_end, post, post_start+halfLen, post_end-1);
}
}
题目十八:判断二叉树是否存在从根结点到叶子结点路径权值之和等于sum
bool hasPathSum(TreeNode* root, int sum){
if(root==NULL) return false;
if(root->left==NULL && root->right==NULL) return sum==root->val;
return hasPathSum(root->left, sum-root->val);
return hasPathSum(root->right, sum-root->val);
}
题目十九:判断二叉树是否相似
boolen similar(TreeNode* root1, TreeNode* root2){
if(root1==NULL && roo2==NULL) return true;
if(root1==NULL || root2==NULL) return false;
return similar(root1->left,root2->left) && similar(root1->right,root2->right);
}