一波二叉樹遍歷問題的C++解答實(shí)例分享
題目一:
輸入一顆二元樹,從上往下按層打印樹的每個(gè)節(jié)點(diǎn),同一層按照從左往右的順序打印。
輸入樣例:
8 / / 6 10 / / / / 5 7 9 11
輸出樣例:
思路分析:
把一顆二叉樹抽象成三個(gè)節(jié)點(diǎn):根節(jié)點(diǎn)、左節(jié)點(diǎn)、右節(jié)點(diǎn)。
先序遍歷即可得到按行輸出的效果。
對(duì)于左子樹只要保存其根節(jié)點(diǎn),既保存了整個(gè)左子樹。(右子樹一樣)
對(duì)于根節(jié)點(diǎn)之外的兩個(gè)子樹來說說,始終是先訪問左子樹的根節(jié)點(diǎn),再訪問右子樹的根節(jié)點(diǎn)。
因此可以使用隊(duì)列存儲(chǔ)。
代碼實(shí)現(xiàn)(GCC編譯通過):
#include "stdio.h" #include "stdlib.h" //二叉樹節(jié)點(diǎn) #define size 7 //二叉樹節(jié)點(diǎn)定義 typedef struct node { int data; struct node *left; struct node *right; }BTree; int printLine(BTree * root); BTree * CreatTree(int a[],int n); int main(void) { int array[size] = {8,6,10,5,7,9,11}; BTree * root; root = CreatTree(array,size); printLine(root); printf("\n"); return 0; } int printLine(BTree * root) { BTree * queue[size], *p; int front,rear; front = rear = 0; rear = (rear+1)%size; queue[rear] = root; //循環(huán)結(jié)束為隊(duì)列為空 while(front != rear) { //根出隊(duì)列 front = (front +1)%size; p = queue[front]; printf("%3d",p->data); //左孩子不空,隊(duì)不滿入隊(duì) if(p->left && ((rear+1)%size != front)) { rear = (rear+1)%size; queue[rear] = p->left; } //右孩子不空,隊(duì)不滿入隊(duì) if(p->right && ((rear+1)%size != front)) { rear = (rear+1)%size; queue[rear] = p->right; } //隊(duì)滿,報(bào)錯(cuò) if((rear+1)%size == front) { printf("隊(duì)列空間不足,錯(cuò)誤....\n"); return 0; } } return 1; } //根據(jù)數(shù)組創(chuàng)建二叉排序樹 BTree * CreatTree(int a[],int n) { BTree * root ,*p,*cu,*pa; int i; root = (BTree *)malloc(sizeof(BTree)); root->data = a[0]; root->left = root->right =NULL; for(i=1;i<n;i++) { p = (BTree *)malloc(sizeof(BTree)); p->data = a[i]; p->left = p->right =NULL; cu = root; while(cu) { pa = cu; if(cu->data > p->data) cu = cu->left; else cu = cu->right; } if(pa->data > p->data) pa->left = p; else pa->right = p; } return root; }
題目二:
輸入一個(gè)整數(shù)數(shù)組,判斷該數(shù)組是不是某二元查找樹的后序遍歷的結(jié)果。
如果是返回 true,否則返回 false。
例如輸入 5、7、6、9、11、10、8,由于這一整數(shù)序列是如下樹的后序遍歷結(jié)果:
8 / \ 6 10 / \ / \ 5 7 9 11
因此返回 true。
如果輸入 7、4、6、5,沒有哪棵樹的后序遍歷的結(jié)果是這個(gè)序列,因此返回 false。
思路:
二叉查找的特征:左子樹的各個(gè)值均小于根,右子樹的各個(gè)值均大于跟
后序遍歷的特征:最后一個(gè)是根,便利順序,左右跟。遞歸
好了,總結(jié)可以得到:
最后一個(gè)是根,最開始連續(xù)若干個(gè)數(shù)小于根的是左子樹的節(jié)點(diǎn),之后連續(xù)若干個(gè)大于根的是右子樹的節(jié)點(diǎn)(左右子樹都可能為空),然后遞歸描述。
代碼描述如下(GCC編譯通過):
#include "stdio.h" #include "stdlib.h" int isPostorderResult(int a[],int n); int helper(int a[],int s,int e); int main(void) { int a[7] = {5,7,6,9,11,10,8}; int b[4] = {7,4,6,5}; int tmp; tmp = isPostorderResult(a,7); printf("%d",tmp); return 0; } int isPostorderResult(int a[],int n) { return helper(a,0,n-1); } int helper(int a[],int s,int e) { int i,j,root; if(s == e) return 1; for(i=0;i<e && a[i]<a[e];i++); if(i != 0 && helper(a,s,i-1) == 0) return 0; for(j=i;j<e && a[j]>a[e];j++); if(j==e && helper(a,i,j-1) == 1) return 1; else return 0; }
題目三:
輸入一顆二元查找樹,將該樹轉(zhuǎn)換為它的鏡像,即在轉(zhuǎn)換后的二元查找樹中,左子樹的結(jié)點(diǎn)都大于右子樹的結(jié)點(diǎn)。
用遞歸和循環(huán)兩種方法完成樹的鏡像轉(zhuǎn)換。
例如輸入:
8 / \ 6 10 /\ /\ 5 7 9 11
輸出:
8 / \ 10 6 /\ /\ 11 9 7 5
分析:
遞歸程序設(shè)計(jì)比較簡(jiǎn)單
訪問一個(gè)節(jié)點(diǎn),只要不為空則交換左右孩子,然后分別對(duì)左右子樹遞歸。
非遞歸實(shí)質(zhì)是需要我們手動(dòng)完成壓棧,思想是一致的
代碼如下(GCC編譯通過):
#include "stdio.h" #include "stdlib.h" #define MAXSIZE 8 typedef struct node { int data; struct node * left; struct node * right; }BTree; void swap(BTree ** x,BTree ** y);//交換左右孩子 void mirror(BTree * root);//遞歸實(shí)現(xiàn)函數(shù)聲明 void mirrorIteratively(BTree * root);//非遞歸實(shí)現(xiàn)函數(shù)聲明 BTree * CreatTree(int a[],int n);//創(chuàng)建二叉樹(產(chǎn)生二叉排序樹) void Iorder(BTree * root);//中序遍歷查看結(jié)果 int main(void) { int array[MAXSIZE] = {5,3,8,7,2,4,1,9}; BTree * root; root = CreatTree(array,MAXSIZE); printf("變換前:\n"); Iorder(root); printf("\n變換后:\n");//兩次變換,與變化前一致 mirror(root); mirrorIteratively(root); Iorder(root); printf("\n"); return 0; } void swap(BTree ** x,BTree ** y) { BTree * t = * x; * x = * y; * y = t; } void mirror(BTree * root) { if(root == NULL)//結(jié)束條件 return; swap(&(root->left),&(root->right));//交換 mirror(root->left);//左子樹遞歸 mirror(root->right);//右子樹遞歸 } void mirrorIteratively(BTree * root) { int top = 0; BTree * t; BTree * stack[MAXSIZE+1]; if(root == NULL) return; //手動(dòng)壓棧、彈棧 stack[top++] = root; while(top != 0) { t = stack[--top]; swap(&(t->left),&(t->right)); if(t->left != NULL) stack[top++] = t->left; if(t->right != NULL) stack[top++] = t->right; } } //產(chǎn)生二叉排序樹 BTree * CreatTree(int a[],int n) { BTree * root ,*p,*cu,*pa; int i; root = (BTree *)malloc(sizeof(BTree)); root->data = a[0]; root->left = root->right =NULL; for(i=1;i<n;i++) { p = (BTree *)malloc(sizeof(BTree)); p->data = a[i]; p->left = p->right =NULL; cu = root; while(cu) { pa = cu; if(cu->data > p->data) cu = cu->left; else cu = cu->right; } if(pa->data > p->data) pa->left = p; else pa->right = p; } return root; } //中序遍歷 void Iorder(BTree * root) { if(root) { Iorder(root->left); printf("%3d",root->data); Iorder(root->right); } }
上一篇:詳解C++文件讀寫操作
欄 目:C語(yǔ)言
下一篇:C語(yǔ)言實(shí)現(xiàn)的猜拳游戲代碼分享
本文標(biāo)題:一波二叉樹遍歷問題的C++解答實(shí)例分享
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2481.html
您可能感興趣的文章
- 01-10深入二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10深入理解二叉樹的非遞歸遍歷
- 01-10深入遍歷二叉樹的各種操作詳解(非遞歸遍歷)
- 01-10判斷整數(shù)序列是否為二元查找樹的后序遍歷結(jié)果的解決方法
- 01-10探討:C++實(shí)現(xiàn)鏈?zhǔn)蕉鏄?用非遞歸方式先序,中序,后序遍歷二叉樹
- 01-10如何在二叉樹中找出和為某一值的所有路徑
- 01-10深入linux下遍歷目錄樹的方法總結(jié)分析
- 01-10先序遍歷二叉樹的遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn)深入解析
- 01-10二叉搜索樹的插入與刪除(詳細(xì)解析)
- 01-10二叉查找樹的插入,刪除,查找


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子