非遞迴遍歷

2021-09-08 15:49:39 字數 2226 閱讀 4450

1. 先將a初始化為 false(標誌位),放入棧中

2. 從棧中彈出 乙個元素,如果是fasle,將標誌改為true,再將 左右節點b f 初始化為false,

3. 按順序push到棧中,順序不同意味著(先、中、後序遍歷)

4. 再彈出乙個元素,判斷標準位,是 true直接輸出

5. 再彈出元素(如果是null,直接continue,繼續下次迴圈),判斷標誌位,重複2操作

6. 直到彈出元素,結束

stack.h

#ifndef __stack_h

#define __stack_h

#define max_size 1024

typedef

struct stack

stack;

stack*

init_stack

(void);

void

push_stack

(stack* stack,

void

* data)

;void

pop_stack

(stack* stack)

;void

*top_stack

(stack* stack)

;void

clear_stack

(stack* stack)

;void

free_stack

(stack* stack)

;int

size_stack

(stack* stack)

;#endif

stack.c

#include

"../include/stack.h"

#include

stack*

init_stack

(void

)return stack;

}void

push_stack

(stack* stack,

void

* data)

void

pop_stack

(stack* stack)

void

*top_stack

(stack* stack)

void

clear_stack

(stack* stack)

}void

free_stack

(stack* stack)

intsize_stack

(stack* stack)

main.c

#include

"../include/stack.h"

#include

#include

#include

#define false 0

#define true 1

typedef

struct binarynode

binarynode;

typedef

struct nodepackage //將節點新增乙個標誌位,

nodepackage;

intmain

(void);

//將a初始化成 false ,push到棧中

push_stack

(stack,

&p1)

;while

(stack->size)

else

//是false, 將標誌改 true,再將左子樹,右子樹封裝好,按順序push到棧中}}

return0;

}

結果: decbhg

非遞迴DFS遍歷

dfs就是回溯法,用遞迴的方法是很自然的。那麼該如何遞迴呢?簡單的說就是 1 如果當前節點沒有被搜尋過,那麼處理當前節點,並標記為搜尋過 如果當前節點已經被搜尋過,退出 2 遞迴遍歷所有沒有被搜尋過的臨接節點。注意,第一步的退出條件。遞迴必須有退出條件,否則會出現死迴圈。對任意節點呼叫上述dfs函式...

樹的遍歷遞迴非遞迴

1先序 遞迴 class solution public void b list list,treenode tree 非遞迴 class solution else return list 2中序 遞迴 class solution public void b list list,treenode...

樹的非遞迴遍歷

在vs2011版本中除錯通過。include stdafx.h include stack.h include 標準庫中定義的棧 includeusing namespace std define max len 15 void create tree treenode head,char pdat...