c 生成表示式二叉樹並正向列印輸出 顯示

2021-10-11 06:55:43 字數 1773 閱讀 8035

思路:先把輸入的中綴表示式轉化為字尾表示式,再通過字尾表示式來建立一顆表示式二叉樹,最後正向列印二叉樹。

正向列印二叉樹的思路已寫在_initpos_函式中,具體參見注釋。

#include

using

namespace std;`在這裡插入**片`

struct node};

class

tree

void

_initd_()

}}node *

front()

void

creattreebymidexpression

(string midexp)

father =

newnode

(s[i]

, left, right)

; lake.

push

(father);}

//程式邏輯:從頭至尾遍歷字尾表示式 遇到運算子 就將運算子前面的兩個元素與運算子一起建立乙個子樹 然後將這個子樹壓入待處理棧 當遇到乙個運算子前面的兩個字元中有運算子時 就講棧頂的元素作為當前所訪問的運算子的左子樹或右子樹

myroot = lake.

top();

//最後直接返回棧頂的元素就是要求的表示式二叉樹

} string transtoafexp

(string midexp)

else

if(midexp[i]

==')'

) opratorstack.

pop();

continue;}

if(opratorstack.

top()==

'(')

if(operator[midexp[i]

]> operator[opratorstack.

top()]

) opratorstack.

push

(midexp[i]);

else

opratorstack.

push

(midexp[i]);

}}}while

(opratorstack.

top()!=

'0')

return res;

//返回處理好的字尾表示式

}bool

isoperator

(char s)

void

display

(node *root)

}void

_initpos_

(node* root)

_initpos_

(root-

>left);if

(root-

>right)

_initpos_

(root-

>right);}

}//程式邏輯:越接近於根節點的位置 列座標的變化越大 而對於接近根的程度可以用行座標來描述 對於乙個節點 左兒子的列座標比父節點的列座標小 而右兒子的列座標比父節點的列座標要大 根據深度來做出相應的調整即可

void

printpos

(node* root)

}void

_initprint_

(node* root)

}void

print()

cout << endl;}}

};intmain()

中綴表示式生成二叉樹

中綴表示式生成二叉樹,大概應該有遞規,迭代,和編譯原理中的自頂向下的 分析法等。遞規,迭代的思路每次讀出乙個數字,乙個運算子,比較當前運算子和之前符號的優先順序,進行相關的操作。自頂向下的 分析法,做了下,實在忘記的差不多了,先占個位。以後完成。tree.c include head.h struc...

C 二叉樹表示式計算

很早以前就寫過雙棧的表示式計算.這次因為想深入學一下二叉樹,網上都是些老掉牙的關於二叉樹的基本操作.感覺如果就學那些概念,沒意思也不好記憶.於是動手寫了乙個表示式計算的應用例子.這樣學習印象才深嘛.我喜歡逆過來貼 這是執行結果 cal 是節點類裡的計算方法,從根節點呼叫,遞迴所有子節點進行計算.le...

棧 二叉樹 表示式 表示式樹 表示式求值

總時間限制 1000ms 記憶體限制 65535kb 描述 眾所周知,任何乙個表示式,都可以用一棵表示式樹來表示。例如,表示式a b c,可以表示為如下的表示式樹 a b c 現在,給你乙個中綴表示式,這個中綴表示式用變數來表示 不含數字 請你將這個中綴表示式用表示式二叉樹的形式輸出出來。輸入 輸入...