思路:先把輸入的中綴表示式轉化為字尾表示式,再通過字尾表示式來建立一顆表示式二叉樹,最後正向列印二叉樹。
正向列印二叉樹的思路已寫在_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 現在,給你乙個中綴表示式,這個中綴表示式用變數來表示 不含數字 請你將這個中綴表示式用表示式二叉樹的形式輸出出來。輸入 輸入...