1. 程式人生 > >二叉樹遍歷的c++具體實現

二叉樹遍歷的c++具體實現

樹的資料結構如下:

struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
};

一、先序遍歷

按照“根結點-左孩子-右孩子”的順序進行訪問

1、遞迴實現

//先序遍歷,根-左-右
void preorder(TreeNode *root){
    //遞迴寫法
    if(root!=NULL){
        cout<<root->val<<"";
        preorder(root->left);
        preorder(root->right);
    }
}

2、非遞迴實現

設定一個棧s,首先判斷根節點是否為空,如為空直接返回,不為空就將根節點入棧,然後執行如下迴圈。

判斷當前棧是否非空,非空時,取出棧頂節點node,遍歷node的值。然後判斷node的右孩子是否存在,若存在將右孩子入棧。最後判斷node的左孩子是否存在,若存在將左孩子入棧。然後繼續迴圈判斷棧是否非空....

程式碼如下:

vector<int>preorder(TreeNode *root){
    vector<int> res;
    if(NULL == root){
        return res;
    }
    stack<TreeNode*> s;
    s.push(root);
    while(!s.empty()){
        TreeNode* cur = s.top();
        s.pop();
        res.push_back(cur->val);
        if(cur->right){
            s.push(cur->right);
        }
        if(cur->left){
            s.push(cur->left);
        }
       //因為棧是先進後出,因此應先將右孩子結點入棧,然後再將左孩子入棧
    }//while
    return res;
}
 

二、中序遍歷

按照“左孩子-根結點-右孩子”的順序進行訪問

1、遞迴實現

void inorder(TreeNode *root){
    if(root != NULL){
        inorder(root->left);
        cout<<root->val<<""<<endl;
        inorder(root->right);
    }
}
 

2、非遞迴實現

vector<int>inorder(TreeNode *root){
    vector<int> res;
    if(NULL == root){
        return res;
    }
    stack<TreeNode*> s;
    TreeNode *cur = root;
    while(cur != NULL || !s.empty()){
        while(cur != NULL){
            s.push(cur);
            cur = cur->left;
        }
        if(!s.empty()){
            cur = s.top();
            res.push_back(cur->val);
            s.pop();
            cur = cur->right;
        }
    }//while
    return res;
 
}

三、後序遍歷

按照“左孩子-右孩子-根結點”的順序進行訪問

1、遞迴實現

void postorder(TreeNode *root){
    if(root != NULL){
        postorder(root->left);
        postorder(root->right);
        cout<<root->val<<""<<endl;
    }
}

2、非遞迴實現

借用先序遍歷的非遞迴實現思路,後序遍歷是“左-右-根”,即“根-右-左”的逆序,先用先序遍歷思路實現“根-右-左”,然後將vector逆序一下即可。

vector<int>postorder(TreeNode *root){
    //先實現根-右-左
    vector<int> res;
    if(NULL == root){
        return res;
    }
    stack<TreeNode*> s;
    s.push(root);
    while(!s.empty()){
        TreeNode * node = s.top();
        s.pop();
        res.push_back(node->val);
        if(node->left){
            s.push(node->left);
        }
        if(node->right){
            s.push(node->right);
        }
    }//while
    reverse(res.begin(), res.end());
    return res;
}

相關推薦

c++實現

//自己還真是個菜雞,大一學了一年c++,現在還在基礎的語法上轉圈,還沒有意識到c++真正的 //的強大之處在於它的多變,封裝,等演算法告一段落了在考慮是往Java上走還是深造c++ #include <iostream> #include <stack&

-c實現

bin lib malloc code mage -a oid inf 樹遍歷 這裏主要是三種遍歷,先序(preorder,NLR),中序(Inorder,LNR),後序(Postorder,LRN) N:node,L:left,R:right 基本排序:先序(NLR,

C#

這就是 中序 工作 class stat public 完全 每一個 前期準備 二叉樹遍歷 C# 什麽是二叉樹   二叉樹是每個節點最多有兩個子樹的樹結構  (1)完全二叉樹——若設二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結

C++(前、中、後序,層次、深度

一.使用c++進行前中後遍歷,層次和深度遍歷(非遞迴) 二.程式碼 #include<iostream> #include<queue> #include<vector> #include<stack> using name

的python實現(前序、中序、後序)

實現二叉樹的三種遍歷方式,未完善二叉樹的生成、樹的程式遍歷等,本程式僅做記錄,程式中構造的二叉樹結構如下: # -*- coding: utf-8 -*- """ Created on Thu Sep 13 16:46:46 2018 Description:二叉樹

遞迴實現(前中後與層序

#include <iostream> #include <bits/stdc++.h> using namespace std; const int MA=100; template<class T> struct ThrBiNode {

C++程式碼

/***********************二叉樹遍歷*********************/ #include <iostream> using namespace std; template<class Type> cla

c++具體實現

樹的資料結構如下: struct TreeNode{ int val; TreeNode* left; TreeNode* right; };一、先序遍歷 按照“根結點-左孩

c++實現層序、前序創建,遞歸非遞歸實現

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

C++實現

二叉樹3種深度優先遍歷(遞迴、非遞迴)、層次遍歷,最簡潔、最好記! #include<iostream> #include<stack> #include<queue> using namespace std; //節點定義 struct Node { c

[] 方法總結--遞迴與非遞迴--純C實現

非遞迴方法: 思路一:根據訪問次序來入棧並輸出 思路二:模擬訪問過程 思路三:使用識別符號mark來記錄已經第幾次訪問該結點 /* @Desc:二叉連結串列 無頭結點 @Vesrion:0.0.1 @Time:20180922建立 */ #include

c語言使用指標實現

使用指標實現二叉樹的定義,建立,以及前序遍歷,中序遍歷,後續遍歷。 /* 該程式實現了二叉樹的建立,以及樹的遍歷,前序遍歷,中序遍歷,後序遍歷。 */ #include <stdio.h> #include<stdlib.h> #include &

非遞迴實現(附c++完整程式碼)

先序、中序和後序遍歷過程:遍歷過程中經過結點的路線一樣,只是訪問各結點的時機不同。 從圖中可以看到,前序遍歷在第一次遇見元素時輸出,中序遍歷在第二次遇見元素時輸出,後序遍歷在第三次遇見元素時輸出。 非遞迴演算法實現的基本思路:使用堆疊 一、前序遍歷 1、遞迴實

STL實現

nod 數據 blog new friend const turn ace lrn #include<iostream> using namespace std; template<class Type> class BSTree; templat

——篇(c++)

比較 方便 || 遍歷二叉樹 找到 保存 們的 order out 二叉樹——遍歷篇 二叉樹很多算法題都與其遍歷相關,筆者經過大量學習並進行了思考和總結,寫下這篇二叉樹的遍歷篇。 1、二叉樹數據結構及訪問函數 #include <stdio.h> #includ

算法(深度優先、廣度優先,前序、中序、後序、層次)及Java實現

order new link left 算法 很多 == 都是 off 二叉樹是一種非常重要的數據結構,很多其它數據結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有深度遍歷和廣度遍歷,深度遍歷有前序、中序以及後序三種遍歷方法,廣度遍歷即我們平常所說的層次遍歷。因為樹的定義

:前序,中序,後序,層序的遞迴以及非遞迴實現

樹,是一種在實際程式設計中經常遇到的資料結構,它的邏輯很簡單:除根節點之外每個節點都有且只有一個父節點,除葉子節點之外所有節點都有一個或多個子節點。我們說的二叉樹,就是指子節點最多2個的樹。 二叉樹中,最重要的操作就是遍歷。二叉樹的遍歷分為: 1.前序遍歷:先訪問根節點,

的非遞迴演算法實現

linux c++ 模板類 討論範圍 本部落格只實現二叉樹非遞迴演算法的遍歷,請自行學習二叉樹和模板類等相關知識。程式碼中附帶大量註釋,所以就不在進行詳細說明。 中序遍歷 template <typename T>void Post<T>

演算法(遞迴實現先序中序和後續)(非遞迴實現中序和先續)

二叉樹遍歷 這兩天抓緊把二叉樹遍歷複習了一遍,遞迴實現還是一如既往地簡潔,迭代版本寫了好久還是隻實現了先序和中序,後續一直沒搞明白,有空了再更新。 遞迴實現 void RecursionBackTree(TreeNode * root) {

(四種方式、迭代及遞迴的實現

二叉樹的常見遍歷方式主要有前序,中序和後序,以及層次遍歷(從上到下,從左到右)四種方法。 前、中、後遍歷分別順序如下: 分別通過遞迴和迴圈的方式實現(Python): # -*- coding:utf-8 -*- class TreeNode: def __