1. 程式人生 > >C++實現二叉樹的遞迴遍歷與非遞迴遍歷

C++實現二叉樹的遞迴遍歷與非遞迴遍歷

基本上所有關於二叉樹的操作都是基於二叉樹的遍歷演算法來實現的,因此在這裡講一下二叉樹的遍歷演算法,其中包括遞迴與非遞迴演算法,在演算法中用輸出節點資料來代替對節點的操作。
首先給出這樣一棵數:
這裡寫圖片描述

1、前序遍歷
所謂前序遍歷就是先對節點資料進行處理,然後才對這個節點的左右子樹進行處理。對這棵二叉樹的前序遍歷結果為:ABDCEFG。
遞迴:

    void _PreOrder(PNode& pRoot)
    {
        if (pRoot)
        {
            cout << pRoot->_data <<
" "; _PreOrder(pRoot->_LChild); _PreOrder(pRoot->_RChild); } } void PreOrder() { _PreOrder(_pRoot); cout << endl; }

非遞迴:
非遞迴方式需要用到棧,這裡給出兩種演算法:
第一種:

void PreOrder_Nor1()
      {
           if(NULL == _pRoot)
               return
; stack<pNode> s; s.push(_pRoot); pNode pTemp = NULL; while(!s.empty()) { pTemp = s.top(); cout<< pTemp->_data << " "; s.pop(); if(NULL != pTemp->_RChild) s.push(pTemp->_RChild); if
(NULL != pTemp->_LChild) s.push(pTemp->_LChild); } cout<<endl; }

第二種:

      void PreOrder_Nor2()
      {
           if(NULL == _pRoot)
               return;
           stack<pNode> s;
           s.push(_pRoot);
           pNode cur = NULL;
           while(!s.empty())
           {
                   cur = s.top();
                   s.pop();
                   while(cur)
                   {
                       cout<< cur->_data << " ";
                       if(cur->_RChild)
                           s.push(cur->_RChild);
                       cur = cur->_LChild;
                   }
            }
            cout<<endl;
     }

呼叫三種方法:
這裡寫圖片描述

中序遍歷:
中序遍歷順序為左子樹->節點->右子樹,這棵二叉樹的遍歷結果為:BDAECFG
遞迴:

    void _InOrder(PNode& pRoot)
    {
        if (pRoot)
        {
            _InOrder(pRoot->_LChild);
            cout << pRoot->_data << " ";
            _InOrder(pRoot->_RChild);
        }
    }
    void InOrder()
    {
        _InOrder(_pRoot);
        cout << endl;
    }

非遞迴:

void InOrder_Nor()
{
    if(NULL == _pRoot)
        return;
    stack<pNode> s;
    pNode cur = _pRoot;
    pNode pPre = NULL;
    while(!s.empty() || cur)
    {
        while(cur && cur != pPre)
        {
            s.push(cur);
            cur = cur->_LChild;
        }
        if(s.empty())
            return;
        cur = s.top();
        cout<< cur->_data << " ";
        pPre = cur;
        s.pop();
        cur = cur->_RChild;
    }
    cout<<endl;
}

呼叫兩種中序遍歷演算法:
這裡寫圖片描述

後序遍歷
後序遍歷順序為:左子樹->右子樹->節點,這棵二叉樹的遍歷結果為DBEGFCA
遞迴:

    void _PostOrder(PNode& pRoot)
    {
        if (pRoot)
        {
            _PostOrder(pRoot->_LChild);
            _PostOrder(pRoot->_RChild);
            cout << pRoot->_data << " ";
        }
    }
    void PostOrder()
    {
        _PostOrder(_pRoot);
        cout << endl;
    }

非遞迴:

      void PostOrder_Nor()
      {
          if(NULL == _pRoot)
              return;
          stack<pNode> s;
          s.push(_pRoot);
          pNode cur = _pRoot->_LChild;
          pNode pPre = NULL;
          while(!s.empty())
          {
              while(cur && cur!= pPre)
              {
                  s.push(cur);
                  cur = cur->_LChild;
              }
              if(s.empty())
                  return;
              cur = s.top();
              if(cur->_RChild && cur->_RChild != pPre)
              {
                  cur = cur->_RChild;
              }
              else
              {
                  cout<< cur->_data << " ";
                  pPre = cur;
                  s.pop();
              }
         }
         cout<<endl;
     }

呼叫兩種方法:
這裡寫圖片描述

層序遍歷
層序遍歷演算法不同於前序、中序、後序演算法,層序遍歷用遞迴方式實現比較困難,一般用佇列結合迴圈實現比較簡單。其基本思想是從根節點開始一層一層的從上向下遍歷,其過程為:
這裡寫圖片描述
因此層序遍歷的結果為:ABCDEFG
其程式碼實現為:

    void LevelOrder()
    {
        queue<PNode> q;
        if (_pRoot)
            q.push(_pRoot);
        while (!q.empty())
        {
            PNode tmp = q.front();
            cout << tmp->_data << " ";
            if (tmp->_LChild)
                q.push(tmp->_LChild);
            if (tmp->_RChild)
                q.push(tmp->_RChild);
            q.pop();
        }
        cout << endl;
    }

遍歷結果:
這裡寫圖片描述

演算法實現還有待改進,望高手斧正!

相關推薦

演算法學習之實現結點及其層數的輸出

背景 這半年在準備考研,所以沒有對技術棧進行更新或複習,部落格也沒有更新……但上週學院宣佈畢業設計(企業實習)開題了,要找老師找單位,這才不得不犧牲晚上下軍棋的時間,複習或學習程式設計的知識……   今天記錄一下解決這個問題: 非遞迴實現二叉樹的遍歷,以及輸出每一個結點和其

C++實現前、中、後序

void NoRecursePreTraverse(BiTree tree){ stack<BiNode *> stack; BiNode *node = tree; while(node != NULL || !stack.empty

C++實現

基本上所有關於二叉樹的操作都是基於二叉樹的遍歷演算法來實現的,因此在這裡講一下二叉樹的遍歷演算法,其中包括遞迴與非遞迴演算法,在演算法中用輸出節點資料來代替對節點的操作。 首先給出這樣一棵數: 1、前序遍歷 所謂前序遍歷就是先對節點資料進行處理,然後才

C++實現

#include<iostream> #include<stdlib.h> #include<stack> #include<queue> using namespace std; typedef char ElemType; //二叉樹的二叉連結串列結構,

c++實現層序、前序創建實現

log ios cst ack ret 出棧 隊列 結點 非遞歸實現 #include <iostream> #include <cstdio> #include <stdio.h> #include <string> #i

3.1分別用方式實現先序、中序和後序

題目 用遞迴和非遞迴方式,分別按照二叉樹先序、中序和後序列印所有的節點。 首先給出二叉樹節點結構定義: public class BinaryTreeNode { //二叉樹節點 private int data; private Bi

方式實現先序、中序、後序

先序遍歷:中、左、右 中序遍歷:左、中、右 後序遍歷:左、右、中 比如下面這科樹              1         2       3    4    5   6    7 packag

C#實現

c# 遍歷 二叉樹 遞歸 循環 C#實現二叉樹的前序、中序、後序遍歷。public class BinaryTreeNode { int value; BinaryTreeNode left; BinaryTreeNode r

數據結構 歸和歸方式實現先序、中序和後序

nor post 後序遍歷 order else 對象 二叉樹先序 bre print   二叉樹的先序遍歷順序是根、左、右;中序遍歷順序是左、根、右;後序遍歷順序是左、右、根。   遞歸方式實現如下: 1 public class TreeNode { 2

C++實現建立、前序、中序、後序、層序

看完資料結構二叉樹部分後,通過學習書上的虛擬碼以及其他人的程式碼自己動手實現了一下,採用前序方式建立一顆二叉樹,實現了前中後層四種遍歷方式。 在層序遍歷部分與前三種遍歷不同,層序遍歷採用從根節點開始從上到下逐層遍歷,所以藉助佇列來實現,開始遍歷後,將根節點先壓入佇列,然後將

c++實現的插入、刪除、查詢、和樹形列印

binary_tree.h 宣告 #ifndef BINARY_TREE #define BINARY_TREE #include "util.h" template<typename T> class tree_node { public: tree_

C++實現的插入、刪除、查詢、

1.二叉樹的概念        樹是一些節點的集合,節點之間用邊連結,節點之間不能有環路。上層的節點稱為父節點,下層節點稱為子節點。最上層的節點稱為根節點。       二叉樹是特殊的樹。對於每個節點

C++實現的三種方式

- 非遞迴實現程式碼: #include<stdio.h> #include<stdlib.h> #include"data_structure.h" //建立一棵二叉樹 BTree create_tree() { BTree

資料結構實驗6:C++實現

實驗6 學號:     姓名:      專業:   6.1 實驗目的 掌握二叉樹的動態連結串列儲存結構及表示。 掌握二叉樹的三種遍歷演算法(遞迴和非遞迴兩類)。 運用二叉樹三種遍歷的方法求解有關問題。 6

C實現

建立介面/*tree.h -- 二叉查詢樹*/ #pragma once //只編譯一次 #define SLEN 20 /*根據具體情況定義Item*/ typedef struct item { char petname[SLEN];

C++的前序建立前中後

#include <iostream> using namespace std; struct BiTNode{ char data; struct BiTNode *l

C#實現--連結串列結構

1 /// <summary> 2 /// 二叉搜尋樹:結點的左子節點的值永遠小於該結點的值,而右子結點的值永遠大於該結點的值 稱為二叉搜尋樹 3 /// </summary> 4 public class LinkBinarySear

c++實現及筆試題(1)

1.建立二叉樹2.前序遍歷<遞迴與非遞迴> 3.中序遍歷<遞迴與非遞迴> 4.後序遍歷<遞迴與非遞迴> 5.層次遍歷  6.獲得節點葉子的個數7.二叉樹獲得的高度8.二叉樹交換的左右兒子9.求兩個節點pNode1和pNode2在以[R為樹

資料結構演算法——表示式類的C++實現()

表示式簡介: 表示式樹的樹葉是運算元,如數字或字母,而其它結點為操作符(+ - * / %等);由於這裡的操作都是二元的,所以這棵特定的樹正好是二叉樹。 下面這個樹的中綴表示式為:(a+b*c) + ((d*e + f)*g);(可以中序遍歷該表示式樹獲得該

C++實現連結串列

#include "stdafx.h" #include <iostream> #include <deque> using namespace std; template<typename T> struct TreeNode{