遍歷二叉樹的全部方法(遞歸+非遞歸)

#include<iostream>    
#include<queue>    
#include<stack>    
using namespace std;    //二叉樹結點的描述    
typedef struct BiTNode  
{    char data;    struct BiTNode *lchild, *rchild;      //左右孩子    
}BiTNode,*BiTree;    //按先序遍歷創建二叉樹    
//BiTree *CreateBiTree()     //返回結點指針類型    
//void CreateBiTree(BiTree &root)      //引用類型的參數    
void CreateBiTree(BiTNode **root)    //二級指針作為函數參數    
{    char ch; //要插入的數據    scanf("\n%c", &ch);  //cin>>ch;    if(ch=='#')  *root = NULL;  else  {  *root = (BiTNode *)malloc(sizeof(BiTNode));  (*root)->data = ch;  printf("請輸入%c的左孩子:",ch);  CreateBiTree(&((*root)->lchild));  printf("請輸入%c的右孩子:",ch);  CreateBiTree(&((*root)->rchild));  }  
}  //前序遍歷的算法程序    
void PreOrder(BiTNode *root)  
{    if(root==NULL)    return ;    printf("%c ", root->data); //輸出數據    PreOrder(root->lchild); //遞歸調用,前序遍歷左子樹    PreOrder(root->rchild); //遞歸調用,前序遍歷右子樹    
}    //中序遍歷的算法程序    
void InOrder(BiTNode *root)    
{    if(root==NULL)  return ;  InOrder(root->lchild); //遞歸調用,前序遍歷左子樹    printf("%c ", root->data); //輸出數據    InOrder(root->rchild); //遞歸調用,前序遍歷右子樹    
}    //后序遍歷的算法程序    
void PostOrder(BiTNode *root)  
{  if(root==NULL)  return ;  PostOrder(root->lchild);      //遞歸調用,前序遍歷左子樹    PostOrder(root->rchild);      //遞歸調用,前序遍歷右子樹    printf("%c ", root->data);    //輸出數據      
}    /*  
二叉樹的非遞歸前序遍歷,前序遍歷思想:先讓根進棧,只要棧不為空,就可以做彈出操作,  
每次彈出一個結點,記得把它的左右結點都進棧,記得右子樹先進棧,這樣可以保證右子樹在棧中總處于左子樹的下面。  
*/    
void PreOrder_Nonrecursive(BiTree T)     //先序遍歷的非遞歸      
{    if(!T)      return ;      stack<BiTree> s;    s.push(T);    while(!s.empty())    {    BiTree temp = s.top();    cout<<temp->data<<" ";    s.pop();    if(temp->rchild)    s.push(temp->rchild);    if(temp->lchild)    s.push(temp->lchild);    }    
}    void PreOrder_Nonrecursive1(BiTree T)     //先序遍歷的非遞歸   
{  if(!T)    return ;  stack<BiTree> s;  BiTree curr = T;  while(curr != NULL || !s.empty())  {  while(curr != NULL)  {  cout<<curr->data<<"  ";  s.push(curr);  curr = curr->lchild;  }  if(!s.empty())  {  curr = s.top();  s.pop();  curr = curr->rchild;  }  }  
}  void PreOrder_Nonrecursive2(BiTree T)     //先序遍歷的非遞歸    
{    if(!T)  return ;    stack<BiTree> s;    while(T)          // 左子樹上的節點全部壓入到棧中    {    s.push(T);    cout<<T->data<<"  ";    T = T->lchild;    }    while(!s.empty())    {            BiTree temp = s.top()->rchild;  // 棧頂元素的右子樹    s.pop();                        // 彈出棧頂元素    while(temp)          // 棧頂元素存在右子樹,則對右子樹同樣遍歷到最下方    {    cout<<temp->data<<"  ";    s.push(temp);    temp = temp->lchild;    }    }    
}    void InOrderTraverse1(BiTree T)   // 中序遍歷的非遞歸    
{    if(!T)    return ;    BiTree curr = T;    // 指向當前要檢查的節點    stack<BiTree> s;  while(curr != NULL || !s.empty())  {  while(curr != NULL)  {  s.push(curr);  curr = curr->lchild;  }//while  if(!s.empty())  {  curr = s.top();  s.pop();  cout<<curr->data<<"  ";  curr = curr->rchild;  }  }  
}  void InOrderTraverse(BiTree T)   // 中序遍歷的非遞歸    
{    if(!T)    return ;    stack<BiTree> s;    BiTree curr = T->lchild;    // 指向當前要檢查的節點    s.push(T);    while(curr != NULL || !s.empty())    {    while(curr != NULL)    // 一直向左走    {    s.push(curr);    curr = curr->lchild;    }    curr = s.top();    s.pop();    cout<<curr->data<<"  ";    curr = curr->rchild;    }    
}    void PostOrder_Nonrecursive1(BiTree T)  // 后序遍歷的非遞歸      
{      stack<BiTree> S;      BiTree curr = T ;           // 指向當前要檢查的節點    BiTree previsited = NULL;    // 指向前一個被訪問的節點    while(curr != NULL || !S.empty())  // 棧空時結束      {      while(curr != NULL)            // 一直向左走直到為空    {      S.push(curr);      curr = curr->lchild;      }      curr = S.top();    // 當前節點的右孩子如果為空或者已經被訪問,則訪問當前節點    if(curr->rchild == NULL || curr->rchild == previsited)      {      cout<<curr->data<<"  ";      previsited = curr;      S.pop();      curr = NULL;      }      else    curr = curr->rchild;      // 否則訪問右孩子    }      
}     void PostOrder_Nonrecursive(BiTree T)  // 后序遍歷的非遞歸     雙棧法    
{      stack<BiTree> s1 , s2;      BiTree curr ;           // 指向當前要檢查的節點    s1.push(T);    while(!s1.empty())  // 棧空時結束      {    curr = s1.top();    s1.pop();    s2.push(curr);    if(curr->lchild)    s1.push(curr->lchild);    if(curr->rchild)    s1.push(curr->rchild);    }    while(!s2.empty())    {    printf("%c ", s2.top()->data);    s2.pop();    }    
}    int visit(BiTree T)    
{    if(T)    {    printf("%c ",T->data);    return 1;    }    else    return 0;    
}    void LeverTraverse(BiTree T)   //方法一、非遞歸層次遍歷二叉樹     
{    queue <BiTree> Q;    BiTree p;    p = T;    if(visit(p)==1)    Q.push(p);    while(!Q.empty())    {    p = Q.front();    Q.pop();    if(visit(p->lchild) == 1)     Q.push(p->lchild);    if(visit(p->rchild) == 1)    Q.push(p->rchild);    }    
}    
void LevelOrder(BiTree BT)     //方法二、非遞歸層次遍歷二叉樹     
{    BiTNode *queue[10];//定義隊列有十個空間    if (BT==NULL)    return;    int front,rear;    front=rear=0;    queue[rear++]=BT;    while(front!=rear)//如果隊尾指針不等于對頭指針時    {    cout<<queue[front]->data<<"  ";  //輸出遍歷結果    if(queue[front]->lchild!=NULL)  //將隊首結點的左孩子指針入隊列    {    queue[rear]=queue[front]->lchild;    rear++;    //隊尾指針后移一位    }    if(queue[front]->rchild!=NULL)    {    queue[rear]=queue[front]->rchild;    //將隊首結點的右孩子指針入隊列    rear++;   //隊尾指針后移一位    }    front++;    //對頭指針后移一位    }    
}    int depth(BiTNode *T)   //樹的深度    
{    if(!T)    return 0;    int d1,d2;    d1=depth(T->lchild);    d2=depth(T->rchild);    return (d1>d2?d1:d2)+1;    //return (depth(T->lchild)>depth(T->rchild)?depth(T->lchild):depth(T->rchild))+1;    
}    
int CountNode(BiTNode *T)    
{    if(T == NULL)    return 0;    return 1+CountNode(T->lchild)+CountNode(T->rchild);    
}    int main(void)    
{    BiTNode *root=NULL; //定義一個根結點    int flag=1,k;    printf("                     本程序實現二叉樹的基本操作。\n");    printf("可以進行建立二叉樹,遞歸先序、中序、后序遍歷,非遞歸先序、中序遍歷及非遞歸層序遍歷等操作。\n");    while(flag)    {    printf("\n");    printf("|--------------------------------------------------------------|\n");    printf("|                    二叉樹的基本操作如下:                     |\n");    printf("|                        0.創建二叉樹                          |\n");    printf("|                        1.遞歸先序遍歷                        |\n");    printf("|                        2.遞歸中序遍歷                        |\n");    printf("|                        3.遞歸后序遍歷                        |\n");    printf("|                        4.非遞歸先序遍歷                      |\n");    printf("|                        5.非遞歸中序遍歷                      |\n");    printf("|                        6.非遞歸后序遍歷                      |\n");    printf("|                        7.非遞歸層序遍歷                      |\n");    printf("|                        8.二叉樹的深度                        |\n");    printf("|                        9.二叉樹的結點個數                    |\n");    printf("|                        10.退出程序                            |\n");    printf("|--------------------------------------------------------------|\n");    printf("                        請選擇功能:");    scanf("%d",&k);    switch(k)    {    case 0:    printf("請建立二叉樹并輸入二叉樹的根節點:");    CreateBiTree(&root);    break;    case 1:    if(root)    {    printf("遞歸先序遍歷二叉樹的結果為:");    PreOrder(root);    printf("\n");    }    else    printf("          二叉樹為空!\n");    break;    case 2:    if(root)    {    printf("遞歸中序遍歷二叉樹的結果為:");    InOrder(root);    printf("\n");    }    else    printf("          二叉樹為空!\n");    break;    case 3:    if(root)    {    printf("遞歸后序遍歷二叉樹的結果為:");    PostOrder(root);    printf("\n");    }    else    printf("          二叉樹為空!\n");    break;    case 4:    if(root)    {    printf("非遞歸先序遍歷二叉樹:");    PreOrder_Nonrecursive1(root);    printf("\n");    }    else    printf("          二叉樹為空!\n");    break;    case 5:    if(root)    {    printf("非遞歸中序遍歷二叉樹:");    InOrderTraverse1(root);    printf("\n");    }    else    printf("          二叉樹為空!\n");    break;    case 6:    if(root)    {    printf("非遞歸后序遍歷二叉樹:");    PostOrder_Nonrecursive(root);    printf("\n");    }    else    printf("          二叉樹為空!\n");    break;    case 7:    if(root)    {    printf("非遞歸層序遍歷二叉樹:");    //LeverTraverse(root);    LevelOrder(root);    printf("\n");    }    else    printf("          二叉樹為空!\n");    break;    case 8:    if(root)    printf("這棵二叉樹的深度為:%d\n",depth(root));    else    printf("          二叉樹為空!\n");    break;    case 9:    if(root)    printf("這棵二叉樹的結點個數為:%d\n",CountNode(root));    else    printf("          二叉樹為空!\n");    break;    default:    flag=0;    printf("程序運行結束,按任意鍵退出!\n");    }    }    system("pause");    return 0;    
}  

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453314.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453314.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453314.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在本地搭建一個Android應用crashing跟蹤系統-ACRA

https://github.com/bboyfeiyu/android-tech-frontier/tree/master/others/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%9C%AC%E5%9C%B0%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAndroid%E5%BA%94%E7%94%A8crashing%E8%B7%9F%E8%B8%AA%E7%B3%BB%E7%BB%9F%EF%BC%8DACRA 如何在本地搭建一個Andr…

20165222第一周查漏補缺

一&#xff0c;第一章要點總結 1&#xff0c;java的特點&#xff1a;面向對象&#xff0c;動態&#xff0c;平臺無關。 2&#xff0c;對于帶包程序的編譯&#xff1a;注意javac -d 編譯到一個文件夾內&#xff0c;然后java -cp 文件夾名 包名.類名。 第一章是比較簡單的&#x…

學習中的十七條建議

作者&#xff1a;孤劍 對于一個自學的人來說&#xff0c;幾條規則當然是必要的了&#xff0c;以下是我自己的一些心得。 1。自信是你成功的第一要素&#xff1b; 2。用心去學&#xff0c;活學活用&#xff1b; 3。新手不要“好高騖遠”&#xff0c;老手不要“驕傲自大”&#x…

tp5 linux路由不跳轉,thinkphp5路由不生效一直跳到首頁的解決方法

自從用laravel框架后&#xff0c;好久沒用過thinkphp框架了&#xff0c;早期用的3.x系列&#xff0c;想熟悉一下thinkphp5&#xff0c;結果入坑了&#xff1b;路由配置一直不起作用&#xff0c;總是跳到首頁&#xff0c;折騰了好久&#xff0c;后來發現是nginx配置的問題&#…

stack堆棧簡介

stack堆棧簡介 堆棧是一個線性表&#xff0c;插入和刪除只在表的一端進行。這一端稱為棧頂(Stack Top)&#xff0c;另一端則為棧底(Stack Bottom)。堆棧的元素插入稱為入棧&#xff0c;元素的刪除稱為出棧。由于元素的入棧和出棧總在棧頂進行&#xff0c;因此&#xff0c;堆棧是…

一份從 0 到 1 的 Java 項目實踐清單

2019獨角獸企業重金招聘Python工程師標準>>> 看了一篇文章&#xff0c;感覺還可以&#xff0c;就給大家共享一下&#xff1a; 對于著手一個項目的時候&#xff0c;要從以下入手&#xff08;即項目清單&#xff09;&#xff1a; 1. 項目規劃 1.1 首先&#xff0c;你得…

JWT 簡介

JWT是一種用于雙方之間傳遞安全信息的簡潔的、URL安全的表述性聲明規范。JWT作為一個開放的標準&#xff08;RFC 7519&#xff09;&#xff0c;定義了一種簡潔的&#xff0c;自包含的方法用于通信雙方之間以Json對象的形式安全的傳遞信息。因為數字簽名的存在&#xff0c;這些信…

FFMPEG的詳細資料可以在它的官方網站上找到

請看官網的文檔欄目: http://ffmpeg.mplayerhq.hu/documentation.html FFmpeg System Documentation Frequently Asked QuestionsFFmpeg program documentationffserver documentationffplay documentationvideo hook documentationsample ffserver configuration fileFFmpeg A…

空指針入棧問題

空指針和數據元素一樣能夠進棧。并且如果棧原來為空&#xff0c;壓入空指針后棧就不會為空了。空指針一旦被賦予指針&#xff0c;如果是在32位機上則占四個字節。只不過是沒有指向堆內存中的任何數據。而空指針已經壓進棧了&#xff0c;不加以釋放就一直存在。

arm linux 中斷 分析,armlinux中斷異常的處理分析.pdf

基于 ARM Linux 中斷、異常的處理分析本文是基于ARM S3C2410X 系統的Linux 2.6 中斷、異常和系統調用的處理分析。主要有以下幾個部分&#xff1a;1. ARM 的硬件中斷機制2. Linux 2.6 對 ARM 中斷向量表的初始化3. Linux 2.6 對 ARM 中斷、異常的處理(從匯編-->C 語言函數&a…

(數據科學學習手札03)Python與R在隨機數生成上的異同

隨機數的使用是很多算法的關鍵步驟&#xff0c;例如蒙特卡洛法、遺傳算法中的輪盤賭法的過程&#xff0c;因此對于任意一種語言&#xff0c;掌握其各類型隨機數生成的方法至關重要&#xff0c;Python與R在隨機數底層生成上都依靠梅森旋轉&#xff08;twister&#xff09;來生成…

音視頻編解碼知識學習詳解(分多部分進行詳細分析)

1. 常用的基本知識 基本概念 編解碼 編解碼器&#xff08;codec&#xff09;指的是一個能夠對一個信號或者一個數據流進行變換的設備或者程序。這里指的變換既包括將信號或者數據流進行編碼&#xff08;通常是為了傳輸、存儲或者加密&#xff09;或者提取得到一個編碼流的操作…

二叉樹非遞歸后序遍歷算法

與正常的非遞歸中序遍歷算法不同于兩點&#xff1a; 一 比正常的中序遍歷算法多了對數據元素的標記。 在壓數據元素入棧&#xff08;標記記為0&#xff0c;用來表示訪問了其左子樹&#xff09;時標記&#xff0c; 還有訪問完左子樹利用gettop&#xff08;&#xff09;獲取雙親…

SQL*Plus命令

SQL*Plus命令 前言 一&#xff1a;SQL*Plus 與數據庫的交互 二&#xff1a;設置SQL* Plus的運行環境 二 - 1 &#xff1a;SET命令概述 二 - 2 &#xff1a;使用SET命令設置運行環境 二 - 2 ____1&#xff1a;Pagesize 變量 1 SYSorcl> show pagesize2 pages…

redis-day1

1 Redis 概述 REmote DIctionary Server(Redis)是一個基于key-value鍵值對的持久化數據庫存儲系統。redis和大名鼎鼎的Memcached緩存服務軟件很像&#xff0c;但是Redis支持的數據存儲類型比Memcached更豐富&#xff0c;包括strings&#xff08;字符串&#xff09;、lists&…

C語言數碼管是共陰共陽程序,C語言實現共陰極數碼管操作

共陰極或者共陽極數碼管&#xff0c;因為其需要電流大&#xff0c;而一般51輸出電流低&#xff0c;需要鎖存器。買的開發板使用的共陰極數碼管。至于其構造&#xff0c;找個相關方面的書看看&#xff0c;這里主要是對做好的電路板進行編程。剛開始的時候&#xff0c;感覺在數碼…

數據庫主要特點

(1)實現數據共享。數據共享包含所有用戶可同時存取數據庫中的數據&#xff0c;也包括用戶可以用各種方式通過接口使用數據庫&#xff0c;并提供數據共享。 (2)減少數據的冗余度。同文件系統相比&#xff0c;由于數據庫實現了數據共享&#xff0c;從而避免了用戶各自建立應用文…

百度與華為全面戰略合作 人工智能手機真的要來了

視頻加載中...12月21日百度和華為在北京宣布達成全面戰略合作。這次合作內容主要包括三點&#xff0c;首先是在語音、語義、視覺和VR上的自然交互&#xff0c;這是百度為華為手機AI賦能的基礎層。第二是基于華為HiAI平臺和百度PaddlePaddle深度學習框架&#xff0c;共建人工智能…

JavaScript數據類型

一、JavaScript數據類型主要分為原始類型和引用數據類型。 原始類型包括(不可拆分的東西)&#xff1a;Number、String、Boolean、Null、Undefined。引用數據類型包括&#xff1a;Object&#xff08;Array&#xff0c;Date&#xff0c;RegExp&#xff0c;Function&#xff09;ty…

funcode拼圖游戲c語言程序,同求funcode平臺下拼圖游戲的C語言代碼

做了好幾天&#xff0c;寫了好多回就是不對&#xff0c;徹底崩潰。。#include "CommonAPI.h"//#include "LessonX.h"#include#define BLOCK_COUNT 4int g_iGameState;intg_iBlockState[BLOCK_COUNT][BLOCK_COUNT];charg_szBlockName[BLOCK_COUNT*BLOCK_COU…