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.使用迴圈代替遞迴演算法,通常可以獲得更好的執行效率和空間效率,在二叉樹層次較深的情況下,採用非遞迴方式遍歷能夠有效的提升遍歷的...