遞迴、棧、非遞迴非棧實現二叉樹的遍歷
先序遍歷的三種演算法:
//遞迴實現先序遍歷 void preorderTree(binNode<Elem>* root){ if(root==NULL){ return; } else{ cout<<root->getElement();//print the value preorderTree(root->left()); preorderTree(root->right()); } } //非遞迴實現先序遍歷(使用棧作為輔助資料結構) void preorderTree(binNode<Elem>* root){ stack<binNode<Elem>*> Stack; if(root==NULL){ return; } while(root||!Stack.empty()){ while(root){ Stack.push(root); cout<<root->getElement();//遍歷 root=root->left(); } root=Stack.top(); Stack.pop(); root=root->right(); } } //不使用棧,非遞迴先序遍歷BST /* *每個節點有個parent指標進行回溯 */ void preorderTree(binNode<Elem>* root){ if(root==NULL){ return; } while(root->left()){ cout<<root->getElement();//遍歷 root=root->left(); } while(root!=NULL){ if(root->right(){//該節點有右孩子 root=root->right(); cout<<root->getElement();//遍歷 while(root->left()){//指向該子樹的最左端 root=root->left(); cout<<root->getElement();//遍歷 } } else{//沒有右孩子 binNode<Elem>* temp=NULL; do{//溯回 temp=root; root=root->parent(); }while(root!=NULL&&temp==root->right()); } } }
中序遍歷:
//遞迴實現中序遍歷 void inorderTree(binNode<Elem>* root){ if(root==NULL){ return; } else{ inorderTree(root->left()); cout<<root->getElement();//print the value inorderTree(root->right()); } } //非遞迴實現中序遍歷(使用棧作為輔助資料結構) void inorderTree(binNode<Elem>* root){ stack<binNode<Elem>*> Stack; if(root==NULL){ return; } while(root||!Stack.empty()){ while(root){ Stack.push(root); root=root->left(); } root=Stack.top(); Stack.pop(); cout<<root->getElement(); root=root->right(); } } //不使用棧,非遞迴中序遍歷BST /* *每個節點有個parent指標進行回溯 */ void inorderTree(binNode<Elem>* root){ if(root==NULL){ return; } while(root->left()){ root=root->left(); } while(root!=NULL){ cout<<root->getElement();//遍歷 if(root->right(){//該節點有右孩子 root=root->right(); while(root->left()){//指向該子樹的最左端 root=root->left(); } } else{//沒有右孩子 binNode<Elem>* temp=NULL; do{//溯回 temp=root; root=root->parent(); }while(root!=NULL&&temp==root->right()); } } }
後序遍歷:
//遞迴實現後序遍歷 void postorderTree(binNode<Elem>* root){ if(root==NULL){ return; } else{ inorderTree(root->left()); inorderTree(root->right()); cout<<root->getElement();//print the value } } //非遞迴實現後序遍歷 /* *使用雙棧作為輔助資料結構 */ void postorderTree(binNode<Elem>* root){ stack<binNode<Elem>*> Stack1; stack<binNode<Elem>*> Stack2; if(root==NULL){ return; } Stack1.push(root); while(!Stack1.empty()){ root=Stack1.top(); Stack2.push(root); Stack1.pop(); if(root->left()) Stack1.push(root->left()); if(root->right()) Stack1.push(root->right()); } while(!Stack2.empty()){ root=Stack2.top(); Stack2.pop(); cout<<root->getElement(); } } //不使用棧,非遞迴後序序遍歷BST /* *每個節點有個parent指標進行回溯 */ void postorderTree(binNode<Elem>* root){ if(root==NULL){ return; } while(root->left()){ root=root->left(); } while(root!=NULL){ if(root->right()){//該節點有右孩子 root=root->right(); while(root->left()){//指向該子樹的最左端 root=root->left(); } } else{//沒有右孩子 //溯回操作 binNode<Elem>* temp=root; root=root->parent(); if(temp==root->left()){ cout<<temp->getElement(); } while(temp==root->right()||root){ cout<<temp->getElement(); temp=root; root=root->parent(); } } } }
相關推薦
c++實現二叉樹層序、前序創建二叉樹,遞歸非遞歸實現二叉樹遍歷
log ios cst ack ret 出棧 隊列 結點 非遞歸實現 #include <iostream> #include <cstdio> #include <stdio.h> #include <string> #i
非遞迴實現二叉樹遍歷(前/中/後序)
//基本資料結構 template<class T> struct BinaryTreeNode { T _data; BinaryTreeNode<T>* _left;
非遞迴實現二叉樹遍歷(附c++完整程式碼)
先序、中序和後序遍歷過程:遍歷過程中經過結點的路線一樣,只是訪問各結點的時機不同。 從圖中可以看到,前序遍歷在第一次遇見元素時輸出,中序遍歷在第二次遇見元素時輸出,後序遍歷在第三次遇見元素時輸出。 非遞迴演算法實現的基本思路:使用堆疊 一、前序遍歷 1、遞迴實
(C語言版)二叉樹遍歷演算法——包含遞迴前、中、後序和層次,非遞迴前、中、後序和層次遍歷共八種
#include <stdlib.h> #include <stdio.h> #include "BiTree.h" #include "LinkStack.h" #include "LinkQueue.h" //初始化二叉樹(含根節點) void InitBiTree(pBiTr
二叉樹遍歷(四種方式、迭代及遞迴的實現)
二叉樹的常見遍歷方式主要有前序,中序和後序,以及層次遍歷(從上到下,從左到右)四種方法。 前、中、後遍歷分別順序如下: 分別通過遞迴和迴圈的方式實現(Python): # -*- coding:utf-8 -*- class TreeNode: def __
不需要棧的二叉樹遍歷的非遞迴演算法
talk is cheap, show you the code ... #include<stdio.h> #include<stdlib.h> struct tNode { int data; struct tNode* lef
二叉樹遍歷理解——遞迴及非遞迴方法中棧的利用
1.二叉樹介紹 二叉樹是每個節點最多有兩個子樹的樹結構,遍歷方法有深度優先(包括:先序、中序、後序遍歷)和寬度優先(層序遍歷),層序遍歷通過佇列可以實現。這裡主要介紹深度優先遍歷的方法以及其中棧的應用,幫助理解二叉樹的結構、遞迴和非遞迴中棧的應用。程式pyth
[二叉樹] 遍歷方法總結--遞迴與非遞迴--純C實現
非遞迴方法: 思路一:根據訪問次序來入棧並輸出 思路二:模擬訪問過程 思路三:使用識別符號mark來記錄已經第幾次訪問該結點 /* @Desc:二叉連結串列 無頭結點 @Vesrion:0.0.1 @Time:20180922建立 */ #include
二叉樹遍歷非遞迴演算法
二叉樹遍歷的非遞迴演算法(java實現) package com.mpackage.tree; import java.util.*; public class TreeSolution { //先根遍歷 public static ArrayList
二叉樹遍歷:前序,中序,後序,層序的遞迴以及非遞迴實現
樹,是一種在實際程式設計中經常遇到的資料結構,它的邏輯很簡單:除根節點之外每個節點都有且只有一個父節點,除葉子節點之外所有節點都有一個或多個子節點。我們說的二叉樹,就是指子節點最多2個的樹。 二叉樹中,最重要的操作就是遍歷。二叉樹的遍歷分為: 1.前序遍歷:先訪問根節點,
二叉樹遍歷的非遞迴演算法實現
linux c++ 模板類 討論範圍 本部落格只實現二叉樹非遞迴演算法的遍歷,請自行學習二叉樹和模板類等相關知識。程式碼中附帶大量註釋,所以就不在進行詳細說明。 中序遍歷 template <typename T>void Post<T>
二叉樹遍歷(前序)(遞迴+非遞迴)
題目 Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes’ values. For example: Given binary
二叉樹遍歷(中序)(遞迴+非遞迴)
Binary Tree Inorder Traversal(二叉樹中序遍歷) Given a binary tree, return the inorder traversal of its nodes’ values. For example: Given binary tree{
二叉樹遍歷 遞迴/非遞迴 模板(??)
遞迴版 void First_order_traversal(int i) //先序 { printf("%d\n", key[i]); First_order_traversal(lc[i]);
二叉樹遍歷演算法(遞迴實現先序中序和後續遍歷)(非遞迴實現中序和先續)
二叉樹遍歷 這兩天抓緊把二叉樹遍歷複習了一遍,遞迴實現還是一如既往地簡潔,迭代版本寫了好久還是隻實現了先序和中序,後續一直沒搞明白,有空了再更新。 遞迴實現 void RecursionBackTree(TreeNode * root) {
二叉樹遍歷之非遞迴演算法
在前一篇文章二叉樹遍歷遞迴演算法對二叉樹遍歷的遞迴演算法做了總結,這篇文章就來對二叉樹遍歷的非遞迴演算法做個彙總。還是與上一篇文章一樣的順序,一一彙總先序、中序、後序以及層序遍歷的非遞迴演算法。 1、先序遍歷(非遞迴演算法) 先序遍歷非遞迴訪問,使用棧即可實現。先序遍
二叉樹遍歷非遞迴寫法c++
1、前序遍歷 /* 將根節點壓棧,(棧先進後出) 然後對於棧頂節點,先輸出棧頂節點的值, 然後把右孩子壓棧,再把左孩子壓棧。 對應於先序遍歷的先遍歷父節點,再遍歷左節點再遍歷右節點的順序 */ void preOrderRecursion(treeNode
二叉樹遍歷總結(先序||中序||後序||按層遍歷||之字遍歷&&遞迴||非遞迴)
先序遍歷:8 6 5 7 10 9 11 後序遍歷:5 7 6 9 11 10 8 中序遍歷:5 6 7 8 9 10 11 按層遍歷:8 6 10 5 7 9 11 之字遍歷:8 10 6 5 7
資料結構----二叉樹遍歷的非遞迴演算法實現
#include <stdio.h> #include <stdlib.h> #include <string.h> #define OK 0; #define ERROR -1 #define OVERFLOW
【C++】非遞迴的三種二叉樹遍歷
二叉樹的遍歷有三種方式,如下: (1)前序遍歷(DLR),首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。簡記根-左-右。 (2)中序遍歷(LDR),首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。簡記左-根-右。 (3)後序遍歷(LRD),首先遍歷左子樹,然後遍歷右