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...