個人部落格
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次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...