二叉樹遍歷的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 __