1. 程式人生 > >二叉樹遍歷c++實現

二叉樹遍歷c++實現

//自己還真是個菜雞,大一學了一年c++,現在還在基礎的語法上轉圈,還沒有意識到c++真正的
//的強大之處在於它的多變,封裝,等演算法告一段落了在考慮是往Java上走還是深造c++
#include <iostream>
#include <stack>
#include <string>
using namespace std;
struct binode
{
	char date;
	binode *lchild,*rchild;
	bool isfirst;//非遞迴後續遍歷要用到
};
class bitree
{
private:
	binode *root;
public:
	bitree()
	{
		create(root);
	};
    ~bitree();
	binode *getroot()
	{
		return root;
	}
	void create(binode *jj)//建立二叉樹
	{
		char aa;
		cin>>aa;
		if(aa==' ') jj=NULL;
		else
		{
			jj=new binode;
			jj->date=aa;
			create(jj->lchild);
			create(jj->rchild);
			jj->isfirst=true;
		}
	}
	void preordert(binode *a)//遍歷二叉樹--先序遍歷遞迴演算法
	{
		cout<<a->date;
		preordert(a->lchild);
		preordert(a->rchild);
	}
	void preordernonrec(binode *aa)//非遞迴先序遍歷
	{
		stack<binode *> s;
		s.push(aa);cout<<aa->date;
		while(!s.empty())
		{
			while(aa->lchild) {aa=aa->lchild;s.push(aa);cout<<aa->date;}//到葉子節點
	        s.pop();//之後走該節點的第三步--判斷該節點的右子樹,出棧後aa仍有該節點地址
			if(!aa->rchild)
			{
				aa=s.top()->rchild;//之前已經走過s.top節點的左子樹
			    s.pop();//這裡也要讓葉子節點的父母節點出棧
			}
			else {aa=aa->rchild;s.push(aa);cout<<aa->date;}
		}
	}
	void ineordernonrec(binode *aa)//非遞迴中序遍歷
	{
		stack<binode *> s;
		s.push(aa);
		while(!s.empty())
		{
			while(aa->lchild) {aa=aa->lchild;s.push(aa);}
			cout<<aa->date;s.pop();
			if(!aa->rchild)
			{
				cout<<s.top()->date;
				aa=s.top()->rchild;
				s.pop();
			}
			else {aa=aa->rchild;s.push(aa);}
		}
	}
	/*從根節點開始遍歷左子樹到葉子節點,之後要遍歷節點的右子樹,
	遍歷右子樹分為兩種情況,第一種右子樹為空,可以直接輸出,使
	該節點出棧;第二種情況右子樹不空,(之前放入棧中的該節點已
	經出棧)這時要把該節點第二次放入棧中,這裡就需要isfirst來標
	記,之後按棧中順序輸出。*/
	void posordernonrec(binode *aa)//非遞後先序遍歷
	{
		stack<binode *> s;
		s.push(aa);
		while(!s.empty())
		{
			while(!s.top()->isfirst)
			{
				cout<<s.top()->date;
				s.pop();
			}
			while(aa->lchild) {aa=aa->lchild;s.push(aa);}//到葉子節點
			s.pop();
			if(!aa->rchild)
			{
				cout<<aa->date;
				s.pop();
			}
			else 
			{
				s.push(aa);
				aa->isfirst=false;
				aa=aa->rchild;
				s.push(aa);
			}
		}
	}
}
int main()
{
	bitree bb;
	bb.preordert(bb.getroot());
	return 0;
}

相關推薦

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

淺談完全實現

首先,什麼是二叉樹 定義:是一種特殊的樹形結構,每個節點至多隻有兩顆子樹,並且子樹有左右之分,其次序不能隨意顛倒,是有序樹的一種。   二叉樹是由一個根結點、兩棵互不相交的左子樹和右子樹組成。 那麼如何實現構造完全二叉樹,如何先序遍歷,中序遍歷,後序遍歷二叉樹 遍歷是要用到

C++程式碼

/***********************二叉樹遍歷*********************/ #include <iostream> using namespace std; template<class Type> cla

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++具體實現

樹的資料結構如下: struct TreeNode{ int val; TreeNode* left; TreeNode* right; };一、先序遍歷 按照“根結點-左孩

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>

的python實現(前序、中序、後序)

實現二叉樹的三種遍歷方式,未完善二叉樹的生成、樹的程式遍歷等,本程式僅做記錄,程式中構造的二叉樹結構如下: # -*- coding: utf-8 -*- """ Created on Thu Sep 13 16:46:46 2018 Description:二叉樹

演算法(遞迴實現先序中序和後續)(非遞迴實現中序和先續)

二叉樹遍歷 這兩天抓緊把二叉樹遍歷複習了一遍,遞迴實現還是一如既往地簡潔,迭代版本寫了好久還是隻實現了先序和中序,後續一直沒搞明白,有空了再更新。 遞迴實現 void RecursionBackTree(TreeNode * root) {

(四種方式、迭代及遞迴的實現

二叉樹的常見遍歷方式主要有前序,中序和後序,以及層次遍歷(從上到下,從左到右)四種方法。 前、中、後遍歷分別順序如下: 分別通過遞迴和迴圈的方式實現(Python): # -*- coding:utf-8 -*- class TreeNode: def __