二叉樹遍歷非遞迴寫法c++
1、前序遍歷
/*
將根節點壓棧,(棧先進後出)
然後對於棧頂節點,先輸出棧頂節點的值,
然後把右孩子壓棧,再把左孩子壓棧。
對應於先序遍歷的先遍歷父節點,再遍歷左節點再遍歷右節點的順序
*/
void preOrderRecursion(treeNode* root) {
if (!root) {
cout << "empty tree!\n";
return;
}
stack<treeNode*> s;
s.push(root);
while (!s.empty()) {
treeNode* temp = s.top();
s.pop();
cout << temp->value << " ";
if (temp->right)
s.push(temp->right);
if (temp->left)
s.push(temp->left);
}
}
2、中序遍歷
/*
初始節點為根節點,
若節點不為空,
則將當前節點壓棧,節點替換為節點的左孩子;
否則輸出棧頂元素的值,
當前節點替換為棧頂元素的右孩子,出棧。
對應於中序遍歷的先遍歷左孩子,再遍歷父節點,再遍歷右孩子
*/
void inOrderRecursion(treeNode* root) {
if (!root) {
cout << "empty tree!\n";
return;
}
stack<treeNode*> s;
while (!s.empty() || root) {
if (root) {
s.push(root);
root = root->left;
} else {
treeNode* current = s.top();
s.pop();
cout << current->value << " ";
root = current->right;
}
}
}
3、後序遍歷
/*
由兩個棧實現,
先把根節點壓入第一個棧,
當棧1不為空時,
出棧,並壓入第二個棧,然後將剛才出棧的棧頂元素的左右孩子入棧1;
然後打印出棧2內的元素
對應於後序遍歷的先遍歷左右孩子再遍歷父節點
*/
void postOrderRecursion(treeNode* root) {
if (!root) {
cout << "empty tree!\n";
return;
}
stack<treeNode*> s1, s2;
s1.push(root);
while (!s1.empty()) {
treeNode* current = s1.top();
s1.pop();
s2.push(current);
if (current->left) s1.push(current->left);
if (current->right) s1.push(current->right);
}
while (!s2.empty()) {
treeNode* top = s2.top();
s2.pop();
cout << top->value << " ";
}
}
相關推薦
二叉樹遍歷非遞迴寫法c++
1、前序遍歷 /* 將根節點壓棧,(棧先進後出) 然後對於棧頂節點,先輸出棧頂節點的值, 然後把右孩子壓棧,再把左孩子壓棧。 對應於先序遍歷的先遍歷父節點,再遍歷左節點再遍歷右節點的順序 */ void preOrderRecursion(treeNode
二叉樹遍歷非遞迴寫法之大統一
在學習二叉樹遍歷時,大家都很容易接受遞迴寫法,好理解。對於非遞迴寫法,基本思想是用棧消除遞迴,但是教材上的前序、中序和後序基本上三個寫法,還很難理解。博主親身經歷,找工作中,考查二叉樹遍歷的非遞迴寫法還是常見的。所以決心整理出此文,方便理解和記憶二叉樹遍歷。
二叉樹遍歷非遞迴寫法
來源:http://www.cnblogs.com/BaroC/p/5188545.html 遍歷的非遞迴實現是用棧來實現的,因為棧能提供先入後出。而對於層序遍歷,由於需要遵循層的順序,使用佇列。 1.先序遍歷(中左右) 初始化:根節點入棧。 迴圈:出棧一個節點,訪問這個節
二叉樹遍歷非遞迴演算法
二叉樹遍歷的非遞迴演算法(java實現) package com.mpackage.tree; import java.util.*; public class TreeSolution { //先根遍歷 public static ArrayList
二叉樹遍歷理解——遞迴及非遞迴方法中棧的利用
1.二叉樹介紹 二叉樹是每個節點最多有兩個子樹的樹結構,遍歷方法有深度優先(包括:先序、中序、後序遍歷)和寬度優先(層序遍歷),層序遍歷通過佇列可以實現。這裡主要介紹深度優先遍歷的方法以及其中棧的應用,幫助理解二叉樹的結構、遞迴和非遞迴中棧的應用。程式pyth
二叉樹遍歷非遞歸算法——中序遍歷
spa tdi str max logs nor 算法實現 中序遍歷 非遞歸 二叉樹中序遍歷的非遞歸算法同樣可以使用棧來實現,從根結點開始,將根結點的最左結點全部壓棧,當結點p不再有最左結點時,說明結點p沒有左孩子,將該結點 出棧,訪問結點p,然後對其右孩子做同樣的處理
二叉樹遍歷之遞迴演算法
作者:石鍋拌飯 原文連結 二叉樹的遍歷演算法有多種,典型的有先序遍歷、中序遍歷、後序遍歷以及層序遍歷。而且這些遍歷的遞迴演算法較為簡單,程式碼很少,容易實現,本文就是彙總二叉樹遍歷的遞迴演算法,非遞迴演算法將在下一篇文章中進行總結。本文中用到的二叉樹例項如下:
Uva 248 Tree//二叉樹遍歷,遞迴
這道題剛開始糾結於輸入,還是題刷少了。囧!本來想用strchr函式和指標來操作的,但是在輸入的時候很糾結,就放棄了。這是poj 2255的加強版,不用真正的建樹後在遍歷,直接模擬建樹的過程就解決了。 下面是程式碼: #include<stdio.h&
資料結構之二叉樹遍歷的遞迴演算法
二叉樹是資料結構這門課程中非常重要的知識點,也是最基本的一種樹形結構。在二叉樹的遍歷又是這部分內容的重中之重,那麼今天就這部分內容和大家做一個分享。所謂二叉樹遍歷,就是按照某種特定的次序,遍訪整個二叉樹中的每個結點,使得每個結點被訪問一次,而且只訪問一次。
資料結構二叉樹三種非遞迴的遍歷
#include <stdio.h> #include <malloc.h> #define MAX 30 typedef struct TiNode {char date;struct TiNode *lchild;struct TiNode *r
Java實現二叉樹後序非遞迴遍歷(好理解)
//不明白的大家可以一起討論!歡迎留言! /** * public class Node { public int data; //樹結點標號 public Node lchild;
二叉樹前序、中序、後序遍歷非遞迴寫法的透徹解析
圖a的程式碼段(ii)也可寫成圖b的理由是:由於是葉子節點,p=-=p->rchild;之後p肯定為空。為空,還需經過新一輪的程式碼段(i)嗎?顯然不需。(因為不滿足迴圈條件)那就直接進入程式碼段(ii)。看!最後還是一樣的吧。還是連續出棧兩次。看到這裡,要仔細想想哦!相信你一定會明白的。
二叉樹學習之非遞迴遍歷
二叉樹遞迴遍歷可謂是學過資料結構的同仁都能想一下就能寫出來,但在應聘過程我們常常遇到的是寫出一個二叉樹非遞迴遍歷函式,接著上篇文章寫二叉樹的非遞迴遍歷,先難後易,一步一步的來. 先上程式碼: #include "binarytree.h" #include <
對於二叉樹三種非遞迴遍歷方式的理解
解決二叉樹的很多問題的方案都是基於對二叉樹的遍歷。遍歷二叉樹的前序,中序,後序三大方法算是計算機科班學生必寫程式碼了。其遞迴遍歷是人人都能信手拈來,可是在手生時寫出非遞迴遍歷恐非易事。正因為並非易事,所以網上出現無數的介紹二叉樹非遞迴遍歷方法的文章。可是大家需要的真是那些非遞迴遍歷程式碼和講述嗎?程式碼早
求二叉樹的高度(非遞迴) .----美團二面=----硬傷 當時沒有答上來
#include <queue> using namespace std; int calculateTreeHeight(Node *root) { if(root == NULL) return 0; int visitedNumber = 0;
二叉樹深度之非遞迴
#include <stdio.h> #include <malloc.h> typedef int ElemType; #define MaxSize 50 typedef struct node { ElemType data; struc
二叉連結串列(鏈式二叉樹)的非遞迴建立
這裡我採用的是先序非遞迴建立二叉樹。思路很簡單: 首先要有一個結點陣列。 1.取第一個結點,是否為空,不是就作為樹根,壓棧,是空則樹根為空,結束。 2.取下一個結點a。 3.取棧頂結
二叉樹的建立、遞迴,非遞迴遍歷
#include<bits/stdc++.h> using namespace std; typedef struct ListNode{ struct ListNode *Lchild, *Rchild; string str; ListNode():Lchild
二叉樹後序遍歷非遞迴實現(java)
後序遍歷:雙棧法,和層次遍歷(雙佇列)很相似,唯一區別在於層次遍歷用的 是佇列,後序遍歷用的是棧。 public static void posOrderUnRecur1(Node head){ System.out.print("PosOrder:"); if(head !=
演算法--20181109--二叉樹中序遍歷非遞迴實現
1.二叉樹的中序遍歷 首先看一下遞迴方式的實現方式: class TreeNode: left = None right = None var = 0 def __init__(self, var): self.var = var