1. 程式人生 > >C++二叉樹的遍歷總結

C++二叉樹的遍歷總結

1、二叉樹的儲存結構

     二叉樹是非線性結構,即每個資料結點至多隻有一個前驅,但可以有多個後繼。它可採用順序儲存結構和鏈式儲存結構。

(1)順序儲存結構

     二叉樹的順序儲存,就是用一組連續的儲存單元存放二叉樹中的結點,一般用於完全二叉樹。程式碼如下:

#define Maxsize 100     //假設一維陣列最多存放100個元素
typedef char Datatype;  //假設二叉樹元素的資料型別為字元
typedef struct
{ 
    Datatype bt[Maxsize];
    int btnum;
 }Btseq;
(2)鏈式儲存結構

通常的方法是連結串列中每個結點由三個域組成,資料域和左右指標域,左右指標分別用來給出該結點左孩子和右孩子所在的鏈結點的儲存地址。其結點結構為:

其中,data域存放某結點的資料資訊;lchild與rchild分別存放指向左孩子和右孩子的指標,當左孩子或右孩子不存在時,相應指標域值為空(用符號∧或NULL表示)。利用這樣的結點結構表示的二叉樹的鏈式儲存結構被稱為二叉連結串列。程式碼如下:
typedef char BTElemType;  //定義二叉樹元素的資料型別為字元
typedef struct BiTNode    //定義結點由資料域,左右指標組成
{
	BTElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

   關於二叉樹的遍歷這裡主要採用鏈式儲存結構進行實現。

2、二叉樹的建立

      建立二叉樹需要將原始二叉樹轉化未擴充套件二叉樹,擴充套件二叉樹就可以做到一個遍歷序列確定一顆二叉樹了。可以參考這篇部落格

      通常會採用前序遍歷的方式來實現二叉樹的建立,當然也可以採用中序或者後序遍歷的方式來實現,如此則對應的擴充套件二叉樹則不相同。前序遍歷實現二叉樹建立的程式碼如下:

int CreateBTree(BiTree &T)    //根據前序輸入二叉樹結點中的值
{
	BTElemType data;
	cin>>data;
	if(data == '#')
		T = NULL;
	else
	{
		T = (BiTree)malloc(sizeof(BiTNode)); //生成根結點
		T->data = data;
		CreateBTree(T->lchild);  //構造左子樹
		CreateBTree(T->rchild);  //構造右子樹
	}
	return 0;
}

3、二叉樹的遍歷

    遍歷即將樹的所有結點訪問且僅訪問一次。按照根節點位置的不同分為三種方式:前序遍歷,中序遍歷,後序遍歷。

       前序遍歷:根節點->左子樹->右子樹

       中序遍歷:左子樹->根節點->右子樹

       後序遍歷:左子樹->右子樹->根節點

       另外還有一種層次遍歷,因為不常見,在此不作討論。

(1)前序遍歷

void PrePrint(BiTree &T)
{
	if(T!=NULL)
	{
		if(T->data != '#')
			cout<<T->data<<" ";
		PrePrint(T->lchild);
		PrePrint(T->rchild);
	}
}
(2)中序遍歷
void MidPrint(BiTree &T)
{
	if(T!=NULL)
	{
		MidPrint(T->lchild);
		if(T->data != '#')
			cout<<T->data<<" ";
		MidPrint(T->rchild);
	}
}
(3)後序遍歷
void PostPrint(BiTree &T)
{
	if(T!=NULL)
	{
		PostPrint(T->lchild);
		PostPrint(T->rchild);
		if(T->data != '#')
			cout<<T->data<<" ";
	}
}

綜合程式清單
#include<iostream>

using namespace std;

typedef char BTElemType;

typedef struct BiTNode
{
	BTElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

int CreateBTree(BiTree &T)    //根據前序輸入二叉樹結點中的值
{
	BTElemType data;
	cin>>data;
	if(data == '#')
		T = NULL;
	else
	{
		T = (BiTree)malloc(sizeof(BiTNode)); //生成根結點
		T->data = data;
		CreateBTree(T->lchild);  //構造左子樹
		CreateBTree(T->rchild);  //構造右子樹
	}
	return 0;
}

void PrePrint(BiTree &T)
{
	if(T!=NULL)
	{
		if(T->data != '#')
			cout<<T->data<<" ";
		PrePrint(T->lchild);
		PrePrint(T->rchild);
	}
}

void MidPrint(BiTree &T)
{
	if(T!=NULL)
	{
		MidPrint(T->lchild);
		if(T->data != '#')
			cout<<T->data<<" ";
		MidPrint(T->rchild);
	}
}

void PostPrint(BiTree &T)
{
	if(T!=NULL)
	{
		PostPrint(T->lchild);
		PostPrint(T->rchild);
		if(T->data != '#')
			cout<<T->data<<" ";
	}
}

int main()
{
	BiTree T;
	CreateBTree(T);
	cout<<"前序遍歷結果:";
	PrePrint(T);
	cout<<endl;
	cout<<"中序遍歷結果:";
	MidPrint(T);
	cout<<endl;
	cout<<"後序遍歷結果:";
	PostPrint(T);
	cout<<endl;

	system("pause");
	return 0;
}

參考資料

相關推薦

總結

struct left else oot nor 節點 操作 preorder AC   節點定義如下 1 // Definition for a binary tree node. 2 struct TreeNode { 3 int val; 4 Tre

總結(先序||中序||後序||按層||之字&&遞迴||非遞迴)

先序遍歷: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

[] 方法總結--遞迴與非遞迴--純C實現

非遞迴方法: 思路一:根據訪問次序來入棧並輸出 思路二:模擬訪問過程 思路三:使用識別符號mark來記錄已經第幾次訪問該結點 /* @Desc:二叉連結串列 無頭結點 @Vesrion:0.0.1 @Time:20180922建立 */ #include

C#

這就是 中序 工作 class stat public 完全 每一個 前期準備 二叉樹遍歷 C# 什麽是二叉樹   二叉樹是每個節點最多有兩個子樹的樹結構  (1)完全二叉樹——若設二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結

——篇(c++)

比較 方便 || 遍歷二叉樹 找到 保存 們的 order out 二叉樹——遍歷篇 二叉樹很多算法題都與其遍歷相關,筆者經過大量學習並進行了思考和總結,寫下這篇二叉樹的遍歷篇。 1、二叉樹數據結構及訪問函數 #include <stdio.h> #includ

算法總結

使用 preorder 說明 stack height type pri content 結構圖 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

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++(前、中、後序,層次、深度

一.使用c++進行前中後遍歷,層次和深度遍歷(非遞迴) 二.程式碼 #include<iostream> #include<queue> #include<vector> #include<stack> using name

c++實現

//自己還真是個菜雞,大一學了一年c++,現在還在基礎的語法上轉圈,還沒有意識到c++真正的 //的強大之處在於它的多變,封裝,等演算法告一段落了在考慮是往Java上走還是深造c++ #include <iostream> #include <stack&

非遞迴寫法c++

1、前序遍歷 /* 將根節點壓棧,(棧先進後出) 然後對於棧頂節點,先輸出棧頂節點的值, 然後把右孩子壓棧,再把左孩子壓棧。 對應於先序遍歷的先遍歷父節點,再遍歷左節點再遍歷右節點的順序 */ void preOrderRecursion(treeNode

c++具體實現

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

C++】非遞迴的三種

 二叉樹的遍歷有三種方式,如下: (1)前序遍歷(DLR),首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。簡記根-左-右。 (2)中序遍歷(LDR),首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。簡記左-根-右。 (3)後序遍歷(LRD),首先遍歷左子樹,然後遍歷右

C語言版)演算法——包含遞迴前、中、後序和層次,非遞迴前、中、後序和層次共八種

#include <stdlib.h> #include <stdio.h> #include "BiTree.h" #include "LinkStack.h" #include "LinkQueue.h" //初始化二叉樹(含根節點) void InitBiTree(pBiTr

c語言使用指標實現

使用指標實現二叉樹的定義,建立,以及前序遍歷,中序遍歷,後續遍歷。 /* 該程式實現了二叉樹的建立,以及樹的遍歷,前序遍歷,中序遍歷,後序遍歷。 */ #include <stdio.h> #include<stdlib.h> #include &

C語言 目錄

#include "stdio.h"#include "windows.h"#include <iostream>using namespace std;unsigned long sum = 0;//////////////////////////////////////////////////

C++程式碼

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

非遞迴實現(附c++完整程式碼)

先序、中序和後序遍歷過程:遍歷過程中經過結點的路線一樣,只是訪問各結點的時機不同。 從圖中可以看到,前序遍歷在第一次遇見元素時輸出,中序遍歷在第二次遇見元素時輸出,後序遍歷在第三次遇見元素時輸出。 非遞迴演算法實現的基本思路:使用堆疊 一、前序遍歷 1、遞迴實

第九周專案三C/C++利用思想解決問題

/* *Copyright (c) 2017,煙臺大學計算機與控制工程學院 *All rights reserved. *檔名稱:.cpp *完成日期:2017年11月16日 *版 本 號:v1.0 * 利用二叉樹遍歷思想解決問題 /* 【利

-c實現

bin lib malloc code mage -a oid inf 樹遍歷 這裏主要是三種遍歷,先序(preorder,NLR),中序(Inorder,LNR),後序(Postorder,LRN) N:node,L:left,R:right 基本排序:先序(NLR,