1. 程式人生 > >二叉樹遍歷非遞迴寫法c++

二叉樹遍歷非遞迴寫法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