在表示式二叉樹的學習中,有很多有趣的構造其表示式二叉樹的方法,其中先綴表示式構建表示式二叉樹常見有很多都是利用遞迴的方式去構建,但在閱覽的一篇文件中,引出了非遞迴方式構建其表示式二叉樹概念,雖然相對更麻煩,但在其**實現,探索上還是很有意義的.
c語言實現:
先綴表示式:*-23+45
如圖,如果從左到右讀取先綴表示式,發現操作符就將其入棧,發現操作符的第二個運算元之後,將它們組織成最小的子樹,然後操作符出棧,繼續遍歷下乙個字元。在這個過程中,運算元是不入棧的,棧裡只有操作符,當操作符組織成最小計算單元之後就將其出棧。當棧空的時候,說明先綴表示式遍歷完畢。
結合其表示式二叉樹圖來理解:
先綴表示式:*-23+45
觀察其表示式和二叉樹圖,從左往右讀取,就是其二叉樹的先序遍歷,我們定義乙個樹節點指標記錄其路徑結點.
由於我們要構建的是二叉樹,所以不管數字還是操作符都是樹節點,每讀取乙個符號都要錄入樹節點中,而棧要儲存的也是樹節點.
首先遇到操作符就入棧,指標指向其左孩子節點,然後繼續讀取
如果遇到數字,就存入節點data中,並判定棧頂樹節點符號是否存在右孩子節點,
若不存在右孩子節點,初始化其右孩子節點,並指標指向其右孩子節點,
若棧頂樹節點已存在右孩子節點,說明棧頂符號已有兩個數字孩子結點,這樣就構成乙個基本算式單元,棧頂節點出棧,
指標繼續指向棧頂元素,並繼續判定棧頂樹節點符號是否存在右孩子節點
直到棧頂右孩子節點不存在,或者其棧為空.
對棧內節點分析:
1.符號間為父子關係,且只為雙親與左孩子之間的關係,
2.其節點必定存在左孩子節點,在存在右孩子節點,並完成賦值後,就要進行出棧操作
3.棧記憶體的是樹節點,當棧內一定儲存的是樹節點位址,即存的是樹節點指標,而不是變數值,因為在對棧頂節點讀取並存入右孩子時,要保證其樹節點也發生變化.
c語言:
棧,樹結構宣告:
.h
//二叉樹鏈式儲存結構
typedef
struct node bitnode,
*bitree;
typedef bitree elemtype;
//這裡樹節點一定要用指標,即符號節點入棧時儲存位址,而不是值
//這樣在對棧內的樹節點修改資料時,對樹節點才能起到真正影響
typedef
struct
sqstack,
* sqstacks;
//順序棧
intinitstack
(sqstacks* s)
;int
stackempty
(sqstacks s)
;int
push
(sqstacks s, elemtype x)
;int
pop(sqstacks s)
;int
pops
(sqstacks s, elemtype* x)
;int
gettop
(sqstacks s, elemtype* x)
;
.c
#include
"stack_tool.h"
#include
//動態分配函式和隨機函式
#include
//輸入輸出
//由於此模組中使用了malloc()函式,其是庫中的內容,若不引入庫,將無法動態分配記憶體,
//就會導致動態記憶體分配失敗,變數《無法讀取記憶體》
intinitstack
(sqstacks *s)
intstackempty
(sqstacks s)
intpush
(sqstacks s, elemtype x)
intpop
(sqstacks s)
intpops
(sqstacks s, elemtype *x)
//獲取棧頂成員的位址,通過棧指標獲取棧位址位置,然後通過二級指標返回其成員位址
//這裡由於棧內儲存的是指標,而以及指標雖然傳遞的是位址,但卻是樹節點型別的指標位址
//而我們要儲存樹節點的指標的位址,就需要樹節點的指標的型別指標,也就是二級指標
intgettop
(sqstacks s, elemtype* x)
main.c
char
nexttoken
(char formula)
//跳過空格
return formula[pos++];
}int
isopnum
(char ch)
void
createtree
(bitree* bt,
char formula)
else
tpointer->rchild =
(bitree)
malloc
(sizeof
(bitnode));
tpointer = tpointer->rchild;
} single =
nexttoken
(c);
}}
//輸出帶括號的中綴表示式
void
btreetoexp
(bitree btt,
int deep)
else
}void
btreetoe
(bitree btt)
int
yunsuan
(int a,
int b,
char data)
return count;
}//通過表示式二叉樹,輸出運算結果
intsum
(bitree btt)
count = data -48;
//將char轉為int,然後返回
return count;
}
main()函式:
參考文件:
非遞迴演算法
樹與二叉樹總結
表示式構建二叉樹
棧 二叉樹 表示式 表示式樹 表示式求值
總時間限制 1000ms 記憶體限制 65535kb 描述 眾所周知,任何乙個表示式,都可以用一棵表示式樹來表示。例如,表示式a b c,可以表示為如下的表示式樹 a b c 現在,給你乙個中綴表示式,這個中綴表示式用變數來表示 不含數字 請你將這個中綴表示式用表示式二叉樹的形式輸出出來。輸入 輸入...
表示式求值 表示式轉二叉樹
1 後序表示式求值 後續表示式 逆波蘭式 的特點 沒有括號。求值方法 從前向後掃,遇到運算元壓棧 遇到操作符,從棧中取出2個運算元運算,結果壓棧。最終棧中所剩的數為結果。2 中序表示式求值 我們先來定義運算子的優先順序 從上到下依次公升高 準備2個棧,乙個專門存放運算子,另乙個專門存放運算元。1.遇...
根據中綴表示式構建二叉樹
本文從中綴表示式轉字尾表示式開始,循序漸進介紹根據中綴表示式構建二叉樹的過程。從左往右遍歷中綴表示式,無視空格 遇到運算元直接輸出 遇到操作符通過按照以下規則處理 在遍歷完中綴表示式時讓操作符棧的最後元素出棧 例子 將 2 5 3 1轉換為字尾表示式 基於上面中綴表示式轉字尾表示式的步驟,新增乙個運...