日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二叉树入门题

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树入门题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

序號題目難度本文外鏈方法
1.單值二叉樹簡單跳轉LeetCode遞歸
2.二叉樹深度簡單跳轉LeetCode遞歸
3.翻轉二叉樹簡單跳轉LeetCode遞歸
4.相同的樹簡單跳轉LeetCode遞歸
5.是否為子樹簡單跳轉LeetCode遞歸
6.對稱二叉樹簡單跳轉LeetCode遞歸
7.平衡二叉樹簡單跳轉LeetCode遞歸
8.重建二叉樹中等跳轉牛客遞歸

單值二叉樹

題目

解法一

本題解法很簡單,把任何一顆樹看作當前樹+子樹。判斷當前樹時,如果左孩子存在,同時左孩子的值和根節點值不同返回false,如果右孩子存在,同時右孩子的值和根節點值不同返回false。最后對子樹進行遞歸,也即return 左子樹&&右子樹,有一顆樹出現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;return isUnivalTree(root->left)&&isUnivalTree(root->right);}

解法二
還是用遞歸,使用標記的方法進行。開始默認它是單值二叉樹,然后進入遞歸,此過程訪問結點,用結點的值和根節點比較,如果不同,修改這個標記,直到遞歸結束,在主函數內判斷,若標記不是原來的值了,則不是單值二叉樹,如果沒有改變,則是單值二叉樹。注意傳入標記時,使用地址

void preorder(struct TreeNode* cur,int* x,int head) {if(cur== NULL)return;if(cur->val!=head)*x=0;//存儲不相等的情況置為0preorder(cur->left,x,head);preorder(cur->right,x,head);}bool isUnivalTree(struct TreeNode* root) {if(root==NULL)//空樹,不是單值二叉樹return false;int x=1;//x=1表示是單值,x=0表示不是單值,開始認為它是單值int head=root->val;//取下頭的值,用于比較preorder(root,&x,head);//進行先序遍歷if(x==0)//如果x=0表示不是單值二叉樹return false;else//如果x沒有改變那么就是單值二叉樹return true; }


二叉樹最大深度

題目

解法
這是一個遞歸問題,劃分子問題即可。樹的深度=左子樹的深度和右子樹深度大者取其并加1.。這里注意使用三目運算符時,不要重復遞歸,否則時間復雜度過高

int maxDepth(struct TreeNode* root) {if(root==NULL)return 0;int leftdeep=maxDepth(root->left);int rightdeep=maxDepth(root->right);return leftdeep>rightdeep?leftdeep+1:rightdeep+1;}


翻轉二叉樹

題目

解法
此題比較簡單,只需遞歸,每次遞歸時交換根節點的兩個孩子即可

struct TreeNode* invertTree(struct TreeNode* root) {if(root != NULL){struct TreeNode* cur=root->left;root->left=root->right;root->right=cur;invertTree(root->left);invertTree(root->right);}return root; }


相同的樹

題目

解法
此題也屬于遞歸。如果結構相同同時值相同那么就去判斷其子樹(遞歸),注意中間會有一種特殊情況,如果p和q同時為NULL,這時的二叉樹沒有右子樹,屬于單鏈的二叉樹

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if((p&&q)&&(p->val==q->val))//這種情況相同,可以去判定子樹return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);else if(p==NULL&&q==NULL)//單鏈情況,也屬于相同return true;elsereturn false; }

是否為子樹

題目

本題可以借助相同的樹,如果某一時刻,根節點相同并且其子樹也相同,那么就存在子樹。注意后面遞歸時是“或”,因為如果左樹沒有子樹,還要去右樹找。

bool isSameTree(struct TreeNode* p, struct TreeNode* q)//判斷是否為相同的樹 {if((p==NULL&&q==NULL))return true;if((p&&q)&&(p->val==q->val))//這種情況相同,可以去判定子樹return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);elsereturn false; }bool isSubtree(struct TreeNode* s, struct TreeNode* t) {if(s==NULL)//如果s是空樹,falsereturn false;else if(s->val==t->val && isSameTree(s,t))//如果s和t的根節點相同,并且他們的子樹相同,truereturn true;else//否則再去s的左子樹和右子樹找尋return isSubtree(s->left,t)||isSubtree(s->right,t);}


對稱二叉樹

題目

解法
如果一棵樹它的左子樹和右子樹是呈現鏡像的,那么就是對稱二叉樹。
下面這棵樹是一棵對稱二叉樹,是因為根節點的左孩子的左孩子和根節點的右孩子的右孩子是相同的,同時根節點的左孩子的右孩子和根節點的右孩子的左孩子是相同的。

bool check(struct TreeNode* ll,struct TreeNode* rr) {if(ll==NULL && rr==NULL)//結構相同,切不存在返回truereturn true;else(ll==NULL || rr=NULL)//結構不同return false;return ll->val==rr->val && check(ll->left,rr->right) && check(ll->right,rr->left);//如果所對應結點相同,那么就去判斷子樹情況, }bool isSymmetric(struct TreeNode* root) {return check(root,root);}


平衡二叉樹

題目

解法一

根據平衡二叉樹的定義,如果某個結點的左子樹之差大于1那么就不是空樹,如果小于,則遞歸,看它左子樹和右子樹的情況

```cint depth(struct TreeNode* root)//求深度 {if(root==NULL)return 0;int leftdeep=depth(root->left);int rightdeep=depth(root->right);return leftdeep>rightdeep?leftdeep+1:rightdeep+1;}bool isBalanced(struct TreeNode* root) {if(root==NULL)//空的是平衡return true;if(abs(depth(root->left)-depth(root->right))>1)//如果左右子樹高度差大于1,則不是{return false;}return isBalanced(root->left)&& isBalanced(root->right);//如果不大于1,再看它的左右子樹 }


解法二
解法一本質采取的就是前序遍歷,有一個非常大的缺點,就是高度在重復計算,根節點算了高度,用于判斷根節點,然后第二層結點又去計算,從而使時間復雜度變大。
所以可以優化,才后序遍歷,從最底層開始,如果這一層滿足平衡,那么就給上一層返回true,同時返回自身高度

bool check(struct TtreeNode* root,int* depth)//depth用于向上高度 {if(root==NULL)//遇到空,滿足條件,depth=0.同時向上一節點返回true,表明這個孩子滿足情況{*depth=0;return true;}else//如果不是空,不能直接判斷該結點(后序遍歷){int leftdepth=0;//不是空,先看左if(check(root->left,&leftdepth)==false)return false;//左子樹不滿足情況,剩下都不執行了int rightdepth=0;//左滿足了,看下右if(check(root->right,&rightdepth)==false)return false;//右不滿足,那么就不用判斷本節點了//如果能走到這里,說明左右子樹滿足情況,看本節點if(abs(leftdepth-rightdepth)>1)return false;//本節點不滿足情況//如果走到這里本節點也滿足情況,向上一個接單返回高度和true*depth=leftdepth>rightdepth?leftdepth+1:rightdepth+1;return true;} } bool isBalanced(struct TreeNode* root) {int depth=0;return check(root,&depth);}

重建二叉樹


解法
實則是一個遞歸過程。每遇到一個新節點,就把它當做先序遍歷的根節點進行構造,遇到#就為NULL,當一個結點的左右子樹構造完成時,可以將該節點連接到上方結點,作為上一個結點孩子結點

#include <stdio.h>typedef struct BTNode {char val;struct BTNode* lchild;struct BTNode* rchild; }BTNode;BTNode* CreatTree(char* str,int* i) {if(str[*i]=='#'){(*i)++;//注意不要忘記return NULL;}else{BTNode* root=(BTNode*)malloc(sizeof(BTNode));root->val=str[*i];(*i)++;root->lchild=CreatTree(str,i);root->rchild=CreatTree(str,i);return root;}}void Inorder(BTNode* root) {if(root==NULL)return;Inorder(root->lchild);printf("%c ",root->val);Inorder(root->rchild);} int main() {char str[100];scanf("%s",str);int i=0;Inorder(CreatTree(str,&i)); }

總結

以上是生活随笔為你收集整理的二叉树入门题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。