二叉樹的非遞迴遍歷

2021-09-21 06:31:07 字數 3772 閱讀 3854

個人部落格

1.思路

先序遍歷

使用棧模型,建立乙個結構體維護二叉樹的結點,給這個結點乙個標記,暫且使用false和true表示,拿到二叉樹的根節點,給這個跟結點打上false的標誌然後進行壓棧,(false即為不列印,true即為列印)

把根節點壓棧,然後進入迴圈:

①返回棧頂元素

②出棧③判斷棧頂元素的標誌(false或true)

④如果棧頂元素的標誌位true,直接列印這個結點的值域

⑤如果棧頂元素的標誌位false,把當前結點的右結點入棧並給false標誌,再把當前結點的左結點入棧並給false標誌,最後把當前結點的標誌位改為true然後再進行入棧(壓棧順序右左根,原因是棧模型是先進後出模型)

2.**展示

先建立乙個棧模型:

棧模型的標頭檔案

#pragma once

#include

#include

#include

//建立鏈棧的結點

typedef

struct linknode linknode;

//建立鏈棧

typedef

struct linkstack linkstack;

//寫鏈棧的api

//初始化

linkstack*

init_linkstack()

;//入棧

void

push_linkstack

(linkstack* stack,linknode* data)

;//出棧

void

pop_linkstack

(linkstack* stack)

;//返回棧頂元素

linknode*

top_linkstack

(linkstack* stack)

;//返回棧的元素個數

intsize_linkstack

(linkstack* stack)

;//清空棧

void

clear_linkstack

(linkstack* stack)

;//銷毀棧

void

free_linkstack

(linkstack* stack)

;

棧模型的實現檔案

#pragma once

#include

"linkstack.h"

//寫鏈棧的api

//初始化

linkstack*

init_linkstack()

//入棧

void

push_linkstack

(linkstack* stack,linknode* data)

if(data ==

null

) data->next = stack->head.next;

stack->head.next = data;

stack->size++;}

//出棧

void

pop_linkstack

(linkstack* stack)

if(stack->size ==0)

linknode* pnext = stack->head.next;

stack->head.next = pnext->next;

stack->size--;}

//返回棧頂元素

linknode*

top_linkstack

(linkstack* stack)

if(stack->size ==0)

return stack->head.next;

}//返回棧的元素個數

intsize_linkstack

(linkstack* stack)

//清空棧

void

clear_linkstack

(linkstack* stack)

}//銷毀棧

void

free_linkstack

(linkstack* stack)

}

使用棧模型完成二叉樹的非遞迴遍歷

#define _crt_secure_no_warnings

#include

#include

#include

#include

"linkstack.h"

//自己建立的棧模型

#define my_false 0

//標誌

#define my_true 1

//標誌

typedef

struct cinarynode cinarynode;

//建立乙個結構體封裝結點

typedef

struct stacknode stacknode;

//用二叉樹的結點的建立棧的結點

stacknode*

buynode

(cinarynode* root,

int flag)

//二叉樹的非遞迴遍歷

void

print_tree

(cinarynode* root)

if(node->flag == my_true)

else}}

//二叉樹的遞迴遍歷

void

print_tree_bydg

(cinarynode*root)

printf

("%c "

, root->ch)

;print_tree_bydg

(root->lchild)

;print_tree_bydg

(root->rchild);}

void

testcinarynode()

; cinarynode node2 =

; cinarynode node3 =

; cinarynode node4 =

; cinarynode node5 =

; cinarynode node6 =

; cinarynode node7 =

; cinarynode node8 =

; cinarynode node9 =

; cinarynode node10 =

;//建立資料之間的關係

node1.lchild =

&node2;

node1.rchild =

&node3;

node2.lchild =

&node4;

node2.rchild =

&node5;

node4.lchild =

&node8;

node4.rchild =

&node9;

node5.lchild =

&node10;

node3.lchild =

&node6;

node3.rchild =

&node7;

//二叉樹的非遞迴列印

//使用遞迴方式列印對比

print_tree_bydg

(&node1);}

intmain()

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...

非遞迴遍歷二叉樹

中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...