二叉樹的建立及遍歷(遞迴),好像一直建立不了二叉樹,請高手幫忙除錯一下如果能貼上除錯結果就更好了

2022-04-22 07:15:49 字數 3715 閱讀 7533

1樓:匿名使用者

在用c語言編寫輸入語句的時候常用到scanf函式,初學者在剛用scanf函式輸入時,經常會遇到各種各樣的輸入錯誤,最重要的是一定要記住scanf函式的輸入格式,scanf函式裡包含了哪些東西,輸入的時候就必須有哪些東西,比如:scanf("%c%c%c"),那麼輸入的時候就必須連續輸入3個字元,中間不能有任何空格逗號或者回車符等分開,而如果是scanf("%c,%c,%c"),那麼輸入3個字元的時候中間就必須用一個逗號分隔。

scanf函式最常用的兩種輸入方式%d整數輸入方式,以及%c字元輸入方式。

用%d方式輸入整數時,輸入一串數字然後按回車符,輸入就完成了。而用%c方式輸入字元時,就稍微複雜一點。一般來說用%c輸入字元時,當輸完以後,都習慣按一下回車,這時回車符就成了一個問題。

【例1】:

scanf("%c",&a); /*此時輸入一個字元,並按下回車,那麼變數a將會正確接收輸入的字元*/

scanf("%c",&b); /*但是變數b將會接收到回車符,其值為10,或者說ascii碼為10*/

【例2】:

scanf("%d",&x); /*此時輸入一串數字並回車,變數x將正常接收到輸入的整數*/

scanf("%d",&y); /*變數y不會接收到回車符,需要使用者繼續輸入數字,並回車,正常接收到整數*/

【例3】:

scanf("%d",&x); /*此時輸入一串數字並回車,變數x將正常接收到輸入的整數*/

scanf("%c",&a); /*但是變數a將會接收到回車符,其值為10,或者說ascii碼為10*/

【例4】:

scanf("%d",&x); /*此時輸入一串數字並回車,變數x將正常接收到輸入的整數*/

scanf("%d",&y); /*若此時輸入的是字母而不是數字,比如輸入「s」並回車*/

/*那麼變數y將不會接收到任何字元或數字,其值保持原樣,不發生任何改變*/

scanf("%c",&a); /*此時變數a將接收到上一步輸入的字母*/

/*即變數a中儲存的字元將是"s",而不是回車符*/

【結論】:

當輸入完整數或字元時,後面還需要輸入字元時,為了避免輸入的字元變成回車符,可以在輸入字元前多加一條scanf語句來吃掉前面的回車符。此時用來吃掉回車符的scanf輸入可以用%c方式,也可以用%d方式。當用%c方式來吃掉回車符時,回車符被讀進了char型別變數中,當用%d方式來吃掉回車符時,回車符並沒有被送進int型別變數中,而是在異常的字元輸入後,被自動清除了。

2樓:匿名使用者

你要建立的樹型是什麼樣的?你的輸入應該與樹型有關?所以你輸入資料時不一樣,即使只有五個節點

3樓:常士

在建立函式creat中「 cin>>ch;if(ch==' ')t=null;"

中寫成if(ch=='/')是不是更方便

typedef int status;

在一點該函式的返回值為整型int(或者是status)是不是更好,更容易閱讀

如果是這樣的話

status creat(bitree & t)else t->data=ch;

creat(t->lchild);

creat(t->rchild);

return ok;}

c語言遞迴建立二叉樹 不能得到正確結果

4樓:匿名使用者

問題出在:每建立一個節點都是放在新建立的父節點下面的,你根本沒有返回最新的節點,試問你這些新建節點掛在何處?程式改好了:

你輸入樹的時候應該按照先序進行輸入 (這裡你用的100代替#)如這個樹:

a / \

b #/ \

# #應該輸入:ab###

二樓的答的不太對吧,你的樹應該為:

a / \

b c/ \ / \

# # # #

如果是那樣的樹應該輸入:

ab##c##

我知道你的意思,你遞迴是分成好幾路的,對於這樣的遞迴如果把過程畫出來就是一棵樹,而遞迴的結束是需要在最後的每個葉結點結束,而你這個遞迴的一個結束點就是輸入『#』,但你如果隨便輸入幾個『#』就不一定在該結束的地方結束,當然如果你輸入樹不復雜的話就輸入一串#################,基本會把該結束的遞迴結束的,(當然最好你自己畫一個二叉樹按照你的要求畫出來,不然沒有意思,這樣該輸入幾個#你就可以確定了。)好好看看遞迴的過程。

#include

#include

#include

#define ok 0

#define null 0

#define overflow 0

typedef int telemtype ;

typedef int status ;

typedef struct binarytreebinarytree,*btree;

btree creatbinarytree()return current;

}void inorder(btree p)}int main()

5樓:匿名使用者

我這沒vc 只是粗看了你的** 貌似構思上沒問題 寫的也正確

理論上應該是 程式一執行 輸入根節點的資料 並輸出顯示

然後開始不斷的新增左節點 每輸入一個資料 就在上一層的基礎上在新增一個左節點

直到你輸入100 這時的最下層節點設為a 它沒有左孩子節點

再輸入100 說明a沒孩子節點 給一個資料 則給最下面一層的那個左節點a加上了一個兄弟右節點b

然後 如果輸入資料 則給b不斷地一層一層加左節點 同上

如果輸入100 則b沒有左節點----在次情況下在輸入100,則b沒有孩子節點,這時才向上返回一層 繼續對a b 的父節點的兄弟節點進行操作

如此迴圈 構建二叉樹的方式是最左深度優先遍歷

關於二叉樹的遞迴遍歷還是不理解 那位高手能不能詳細講一下!!! 10

c/c++資料結構:用遞迴方法建立一棵二叉樹,並對該二叉樹進行遍歷(分別進行先序、中序、後序遍歷。)

6樓:袁世平

#include

#include

#include

#include

#include

using namespace std;

struct node;

typedef node *tree;

struct node;

tree bt;

void build(tree &bt)

else

bt=null;

}void prework()

void preorder(tree bt)}void midorder(tree bt)}void backorder(tree bt)}void mainwork(){

preorder(bt);

cout<

表示好像不太記得自己怎麼打的了.....似乎不記得樣例的樣子.....但是思想保證是對的哈,這個程式還是可以的。

7樓:匿名使用者

void buildtree(tree **root)void first(tree *root)void middle(tree *root)void after(tree *root)void main()

二叉樹的遞迴構造

怎樣實現二叉樹的前序遍歷的非遞迴演算法

遞迴不遞迴只是表象,本質都是壓棧,出棧的操作,只不過遞迴是以函式為元素進行的棧操作,不遞迴演算法就是把樹的元素來棧操作,在一個函式內部完成,看起來就沒有遞迴。非遞迴的話,就用堆疊實現了啊 先序遍歷二叉樹的遞迴演算法怎樣理解?二叉樹的結點結構是 1 根結點 存放結點資料 2 左子樹指標 3 右子樹指計...

C語言二叉樹遞迴演算法怎麼做?什麼是二叉樹的遞迴?

include include struct treenode typedef treenode bitree void visit treenode node 結點總數。int node bitree t return node t left node t right 1 前序。void preo...

非遞迴的二叉樹前序遍歷演算法有什麼用途

遞迴和非遞迴只是解決問題的方法的不同,本質還是一樣的。2.遞迴演算法相對於非遞迴演算法來說效率通常都會更低2.2 由於編譯器對附加的一些棧保護機制會導致遞迴執行的更加低效3.使用迴圈代替遞迴演算法,通常可以獲得更好的執行效率和空間效率,在二叉樹層次較深的情況下,採用非遞迴方式遍歷能夠有效的提升遍歷的...