1. 程式人生 > >遞迴、棧、非遞迴非棧實現二叉樹的遍歷

遞迴、棧、非遞迴非棧實現二叉樹的遍歷

先序遍歷的三種演算法:

//遞迴實現先序遍歷
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),首先遍歷左子樹,然後遍歷右