中綴表示式生成二叉樹,大概應該有遞規,迭代,和編譯原理中的自頂向下的**分析法等。
遞規,迭代的思路每次讀出乙個數字,乙個運算子,比較當前運算子和之前符號的優先順序,進行相關的操作。
自頂向下的**分析法,做了下,實在忘記的差不多了,先占個位。以後完成。
tree.c
#include "head.h
"struct node * createnodesetv(int number,char opr,int
type)
;void createnode(struct nodedata nd,struct node *myn)
;char insertnode(struct node * mynode,struct node * father,char
lr)
else
}else
else
}return
result;}//
原來樹的遍歷也就是遞迴.我去,我說自己怎麼老是不得要領.根源在於沒想明白遞迴函式.
void visittree(struct node *root)
else
if(root->ndata.symboltype==1
)
else
if(root->rchilden!='\0'
)
else}//
所以如果用遞迴來做運算必須是後序遍歷,要等左右樹都有結果了,才用符號。
//其實我們的心算和筆算,也是後續遍歷。
int visittree_2(struct node *root)
else
if(root->rchilden!='\0'
)
else
switch (root->ndata.operatorvalue)
case'-
':case'*
':case'/':}
return
result;
}
head.h
//tree
struct
nodedata
;struct
node
;char insertnode(struct node * mynode,struct node * father,char
lr);
struct node * createnodesetv(int number,char opr,int
type);
void createnode(struct nodedata nd,struct node *myn);
void visittree(struct node * root);
1)迭代方法
main.c
基本思路就是我們手工畫圖的步驟。寫成**而已。
每次取乙個數字和操作符,對比操作符和之前操作符的優先順序。狀1,大於,則符號為之前樹的右子樹,數字為符號的左子樹。
狀2,小於,則數字為之前樹的右字樹,之前樹為符號的左子樹。
直至最後,只有乙個數字符,此數字為之前符號的右子樹,
intmain()
else
else
if (lheight(preope,coperator)==0
)
}else
//last char}}
if(rootnode!='\0'
)
return0;
}int getstrlen(char *c)
returni;}
int lheight(char oldc,char
newl)
}else
if(oldc=='#'
)
return0;
}
2) 遞規方式。
尾遞規一般是可以用迴圈迭代來表示。所以這裡遞規其實並不是很體現優勢。
只是可以鍛鍊下遞規的思路,遞規是:把問題難度逐層降低,以至到達某個層次(一般0或1),是個確定的操作不需要遞規,那麼這個層次的上層的操作也變成了確定操作。以至最終解決問題。
這裡一樣的思路:乙個表示式很長,我只能解決乙個數字,乙個操作符,並把他放到之前的樹上。剩下的表示式也就是遺留的問題讓下層去做。下層能做的事和上面一樣。以至到最後,只剩下乙個數字,只能防到右葉,遺留的問題,到這裡終結。
mian.c
void createtree(char * expression,struct node * prenode,charpreope);
struct node * root='\0'
;int
main()
return0;
}void createtree(char * expression,struct node * prenode,char
preope)
else
}else
if (lheight(preope,coperator)==0
)
createtree(expression+2
,prenode,preope);
}else
}
3)自頂向下的**分析。
做了下,沒出來。以後看看。
二叉樹計算中綴表示式
看到 資料結構 思想與實現 這本書裡5.3的程式 給出的程式是有問題的 敲到vs中,發現右閉括號不能起到作用,例如 輸入 3 5 7,輸出則是38,右閉括號沒有起到作用。自己調了很久,終於修改對了,下面是正確的 include using namespace std class calc struc...
中綴表示式轉二叉樹
關於中綴表示式轉二叉樹,其實很簡單,只要記住這幾句話就夠了 就這麼簡單 這樣說可能還有人聽不懂 舉個栗子 a b c d e fa b c d e f a b c d e f從左到右遍歷表示式,找到最後計算的字元 分成3部分 a b c d e f 分為左子樹,根,右子樹 再繼續把每個拆分成三部分,...
根據中綴表示式構建二叉樹
本文從中綴表示式轉字尾表示式開始,循序漸進介紹根據中綴表示式構建二叉樹的過程。從左往右遍歷中綴表示式,無視空格 遇到運算元直接輸出 遇到操作符通過按照以下規則處理 在遍歷完中綴表示式時讓操作符棧的最後元素出棧 例子 將 2 5 3 1轉換為字尾表示式 基於上面中綴表示式轉字尾表示式的步驟,新增乙個運...