东北大学考研二叉树相关试题
設(shè)t為一顆二叉樹的根節(jié)點(diǎn)地址指針,設(shè)計(jì)一個(gè)非遞歸的算法把二叉樹中每個(gè)節(jié)點(diǎn)的左右孩子位置交換
void Exchange(BinTreeNode* t){stack<BinTreeNode*> s;BinTreeNode* p;if(T == NULL){return ;}s.push(t);while(!s.empty()){t = s.top();s.pop();p = t->lchild;t->lchild = t->rchild;t->rchild = p;if(t->lchild){s.push(t->lchild);}if(t->rchild){s.push(t->rchild);}} }
設(shè)t是一顆按后序遍歷方式構(gòu)成的線索二叉樹的根節(jié)點(diǎn)指針,設(shè)計(jì)一個(gè)非遞歸的算法,把一個(gè)地址為x的新節(jié)點(diǎn)插到t樹中,已知地址為y的節(jié)點(diǎn)有則作為節(jié)點(diǎn)y的右孩子,并把插入后的二叉樹仍為后續(xù)線索二叉樹
一顆高度k具有n個(gè)節(jié)點(diǎn)的二叉樹,按順序方式存儲(chǔ);
(1)編寫用先跟遍歷樹種每個(gè)節(jié)點(diǎn)的遞歸算法
(2)編寫將樹種最大序號(hào)葉子節(jié)點(diǎn)的祖先節(jié)點(diǎn)節(jié)點(diǎn)全部打印輸出的算法
一顆高度為k且有n個(gè)節(jié)點(diǎn)的二叉排序樹,同時(shí)又是一顆完全二叉樹存于向量t中,設(shè)計(jì)刪除樹中序號(hào)為i且具有左右孩子的一個(gè)節(jié)點(diǎn),而不使存儲(chǔ)量增加?保證仍為二叉排序樹(不一定是完全二叉樹)
?編寫算法判斷二叉樹是否為平衡二叉樹
int Tree_Depth(BinTreeNode* t){//求t節(jié)點(diǎn)的深度if(t == NULL){return 0;}else{int left_Depth = Tree_Depth(t->left);int right_Depth = Tree_Depth(t->right);return 1+(left_Depth > right_Depth ? left_Depth : right_Depth);} }bool Is_Balance_Tree(BinTreeNode* t){//判斷是否是平衡二叉樹if(t == NULL){return true;}int left_Depth = Tree_Depth(t->left);//左子樹深度int right_Depth = Tree_Depth(t->right);//右子樹深度if(abs(left_Depth - right_Depth) > 1){return false;}else{return Is_Balance_Tree(t->left) && Is_Balance_Tree(t->right);} }編寫一個(gè)算法,利用葉子節(jié)點(diǎn)中的空指針域?qū)⑺腥~子節(jié)點(diǎn)鏈接為一個(gè)帶頭節(jié)點(diǎn)的雙鏈表,算法返回頭結(jié)點(diǎn)的地址
BinTreeNode* head;//鏈表頭節(jié)點(diǎn) BinTreeNode* pre;//鏈表當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)void Creat_list(BinTreeNode* t){if(t){Creat_list(t->lchild);//不一定用中序遍歷,因?yàn)轭}目沒有要求葉子節(jié)點(diǎn)要按照什么樣的順序,因此只要遍歷到所有的葉子節(jié)點(diǎn)就可以。if(t->lchild == NULL && t->right == NULL){if(head == NULL){//兩種情況:頭節(jié)點(diǎn)是否為空head = new BinTreeNode;head->lchild = NULL;head->rchild = t;t->lchild = head;pre = t;}else{pre->rchild = t;t->lchild = pre;pre = t;}}Creat_list(t->rchild);pre->rchild = NULL;} }已知一個(gè)二叉樹的中序序列和后序序列,寫一個(gè)建立該二叉樹的二叉鏈表存儲(chǔ)結(jié)構(gòu)的算法
char inorder_str[] = {};//中序序列 char postorder_str[] = {};//后序序列int Find_Position(char c){//查找字符c在中序序列中的位置int i = 0;for(i = 0;i < inorder_str.lenght();i++){if(inorder_str[i] == c)break;}return i; }void Creat_BinTree(BinTreeNode t,int l1,int h1,int l2,int h2){//l1,h1中序序列的開始和結(jié)束位置;l2,h2后序序列的開始和結(jié)束位置int position = 0t = (BinTreeNode*)malloc(sizeof(BinTreeNode));t->data = postorder_str[h2];t->lchild = NULL;t->rchild = NULL;if(l1 < h1){position = Find_Position(postorder_str[e2]);if(position != l1){//position == l1 時(shí)說明該節(jié)點(diǎn)沒有左子樹Creat_BinTree(t->lchild,l1,positon-1,l2,l2+(position-1-l1));}if(position != h1){//position == h1 時(shí)說明該節(jié)點(diǎn)沒有右子樹Creat_BinTree(t->rchild,position+1,h1,(h2-1)-(h1-position-1),h2-1);}} }寫出刪除二叉排序樹bt中值為x的節(jié)點(diǎn)算法(二叉排序樹以二叉鏈表形式存儲(chǔ),刪除后仍然保持二叉排序樹性質(zhì))
void Delete(BSTree *bst,int x){BSTree* f,*p = bst;while(p && p->data != x){if(p->data > x){f = p;p = p->lchild;}else{f = p;p = p->rchild;}}if(p == NULL){return ;}if(p->lchild == NULL){//被刪子樹沒有左子樹if(f->lchild == p){f->lchild = p->rchild;}else{f->rchild = p->rchild;}}else if(p->rchild == NULL){//被刪子樹沒有右子樹if(f->lchild == p){f->lchild = p->lchild;}else{f->rchild = p->lchild;}}else{BSTree* q = p->lchild;BSTree* s = q;while(q->rchild != NULL){s = q;q = q->rchild;}if(s == p->lchild){//p左子樹的根節(jié)點(diǎn)沒有右子樹p->data = s->data;p->lchild = s->lchild;free(s);}else{//p左子樹的根節(jié)點(diǎn)有右子樹p->data = q->data;s->rchild = q->lchild;free(q);}} }
設(shè)t是一顆滿二叉樹,編寫一個(gè)將t的線序遍歷序列轉(zhuǎn)換為后序遍歷序列的遞歸算法
寫出后序線索二叉樹的非遞歸遍歷算法
編寫一個(gè)遞歸函數(shù),判斷兩顆二叉樹是否相似。如果兩個(gè)二叉樹s和t相似,那么或者他們的左右子樹都相似,或者s和t都為空
bool Is_like(BinTreeNode* t1,BinTreeNode* t2){if(t1 == NULL && t2 == NULL){//分為三種情況return true;}else if(t1 == NULL || t2 == NULL){return false;}else{return Is_like(t1->lchild,t2->rchild) && Is_like(t2->lchild,l2->rchild);} }
對(duì)二叉鏈表存儲(chǔ)的非空二叉樹,從右向左依次釋放所有葉子節(jié)點(diǎn),釋放的同時(shí),把節(jié)點(diǎn)值存放到一個(gè)向量中
該二叉排序樹已經(jīng)以二叉鏈表的形式存儲(chǔ)在內(nèi)存中,使用遞歸算法,求每個(gè)節(jié)點(diǎn)的平衡因子并輸出
int Tree_Depth(BinTreeNode* t){//求t節(jié)點(diǎn)的深度if(t == NULL){return 0;}else{int left_Depth = Tree_Depth(t->left);int right_Depth = Tree_Depth(t->right);return 1+(left_Depth > right_Depth ? left_Depth : right_Depth);} }void printf_num(BinTreeNode* t){if(t != NULL){printf("節(jié)點(diǎn)%d的平衡因子為%d\n",t->value,Tree_Depth(t->left)-Tree_Depth(t->right));printf_num(t->left);printf_num(t->right);} }
?給出中序線索二叉樹的節(jié)點(diǎn)結(jié)構(gòu),試編寫在不使用棧和遞歸的情況下先序遍歷中序線索二叉樹的算法
設(shè)二叉樹中節(jié)點(diǎn)的數(shù)據(jù)域的值互不相同,設(shè)計(jì)一個(gè)算法將數(shù)據(jù)域值為x的節(jié)點(diǎn)的所有祖先節(jié)點(diǎn)的數(shù)據(jù)域打印出來
bool Is_Ancestor(BinTreeNode* t,int x){if(t == NULL){return false;}if(t->value == x){return true;}if(Is_Ancestor(t->lchild,x)||Is_Ancestor(t->rchild,x){printf("%d",t->value);return true;) }設(shè)二叉樹二叉鏈表為存儲(chǔ)結(jié)構(gòu),編寫計(jì)算二叉樹中所有節(jié)點(diǎn)的平衡因子,同時(shí)返回二叉樹中非平衡節(jié)點(diǎn)個(gè)數(shù)的算法
int Tree_Depth(BinTreeNode* t){//求t節(jié)點(diǎn)的深度if(t == NULL){return 0;}else{int left_Depth = Tree_Depth(t->left);int right_Depth = Tree_Depth(t->right);return 1+(left_Depth > right_Depth ? left_Depth : right_Depth);} }int printf_num(BinTreeNode* t){stack<BinTreeNode*> s;if(t == NULL){return 0;}int num = 0;int temp = 0;s.push(t);BinTreeNode* p;while(!s.empty()){p = s.top();s.pop();if(p != NULL){temp = p->value,Tree_Depth(p->left) - Tree_Depth(p->right);printf("節(jié)點(diǎn)%d的平衡因子為%d",p->value,temp);if(temp != 0){num++;}s.push(p->left);s.push(p->right);}}return num; }
設(shè)有n個(gè)節(jié)點(diǎn)的平衡二叉樹的每個(gè)節(jié)點(diǎn)都標(biāo)明了平衡因子b,設(shè)計(jì)節(jié)點(diǎn)存儲(chǔ)結(jié)構(gòu),并編寫求平衡二叉樹的高度的算法(要求算法的時(shí)間復(fù)雜度為o(log2(n)))
一直一顆二叉樹的前序序列和中序序列分別存于兩個(gè)一維數(shù)組中,編寫算法建立該二叉樹的二叉鏈表
類似上面的知中序和后序
假設(shè)一個(gè)僅包含二元運(yùn)算符的算術(shù)表達(dá)式以二叉鏈表形式存儲(chǔ)在二叉樹t中,編寫按后序序列遍歷計(jì)算表達(dá)式的值
二叉樹采用二叉鏈表作為存儲(chǔ)結(jié)構(gòu)。編寫算法,求出二叉樹中第i層和第i+1層葉子節(jié)點(diǎn)個(gè)數(shù)之和
以二叉鏈表為存儲(chǔ)結(jié)構(gòu),編寫算法實(shí)現(xiàn)如下功能,在二叉樹中查找值為x的節(jié)點(diǎn),并求連續(xù)節(jié)點(diǎn)在書中的層數(shù)
總結(jié)
以上是生活随笔為你收集整理的东北大学考研二叉树相关试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ChinaOpenSSL系列笔记足球机器
- 下一篇: i9 11900k参数 i911900