下面的二叉樹建立**是有問題的:
#include #include #define max_len 50
#define elemtype char
#define status int
#define ok 1
#define error 0
#define overflow -1
typedef struct nodebitreenode,*bitree;
/*遞迴建立一棵二叉樹*/
void createbitreebyrec(bitree &t)else
t->data = ch;
createbitreebyrec(t->lchild);
createbitreebyrec(t->rchild); }}
/*前序非遞迴建立二叉樹*/
void createbitreebyprenorec(bitree &t),p=null;
int top = 0;//棧頂指標
scanf("%c",&ch);
if('#'==ch)else
t->data = ch;
s[++top] = t;
p = t;
} while(top!=0)
if(ch!='#')
r->data = ch;
p->lchild = r;
p = r;
s[++top] = r;
}else
if(top!=0)
r->data = ch;
p->rchild = r;
p = r;
s[++top] = r;
}} }
}
當你用下面的遍歷方法遍歷時就會報記憶體錯誤:
/*前序遞迴遍歷*/
void preorderrec(bitree &t)
}/*前序非遞迴遍歷*/
於是你就開始除錯,終於發現了問題:
就是那個0xcdcdcdcd
其實報錯不是在建立的時候,而是在遍歷時:
當t訪問到這個野指標時,就報錯了
而我是怎麼解決的呢,很簡單遍歷時加個判斷條件:
if(t!=null && t!=(bitree)0xcdcdcdcd)
while(p!=null && p!=(bitree)0xcdcdcdcd)
這樣是不會再報錯的,但問題沒有解決,因為:
在 debug 模式下,vc 會把未初始化的棧記憶體上的指標全部填成 0xcccccccc ,當字串看就是 「燙燙燙燙……」,會把未初始化的堆記憶體上的指標全部填成 0xcdcdcdcd
但是,用malloc分配的記憶體為何還要用memset再初始化一次?
平時都沒這麼做呀!
所以暫時先放一放
時隔一星期,
現在這個問題已經解決:
問題出在分配的r指標的左子樹和右子樹沒有置為空:
bitree r;
if(!(r = (bitree)malloc(sizeof(bitreenode))))
r->data = ch;
p->lchild = r;
p = r;
s[++top] = r;
應該修改為:
bitree r;
if(!(r = (bitree)malloc(sizeof(bitreenode))))
r->data = ch;
r->lchild = null;
r->rchild = null;
p->lchild = r;
p = r;
s[++top] = r;
這樣結果就不會報錯了。
所以細心和能力很重要呀。
建立二叉樹 後序建立二叉樹
由後序遍歷可知,輸入順序是左結點 右結點 子樹根結點 比如輸入如下樹 ab cde 輸入序列為 e d b c a 思路 使用棧,對左結點和右結點進行壓棧 1.當輸入遇到非 且棧中元素大於等於2,則可以確定乙個小三角樹形,並將這個樹根作為下乙個小三角樹形的乙個子節點 2.當輸入遇到非 但棧中元素小於...
二叉樹的建立 遍歷1 建立二叉樹
談二叉樹,如果二叉樹都沒有正確的建立出來,那豈不是紙上談兵!括號表示式 表示方法 1.括號 括號內的東西是括號前的元素的孩子 2.逗號 逗號是為了區分左右孩子 演算法分析 給出乙個如上的括號表示式 a b d g e,f 再利用棧這個資料結構,分析一下 掃瞄整個括號表示的字串,這個字串中只有四種字元...
二叉樹建立的輸入問題
這幾天在看資料結構的二叉樹,被二叉樹建立時的輸入問題困擾很久。二叉樹的建立一般使用遞迴演算法,將所有節點的資料一股腦的輸入,遞迴無法停止,二叉樹就無法建立。感謝此博文,原來我們在輸入節點資料的時候,必須輸入空閒葉子節點,並用特殊符號標記,比如上述的博文的空閒葉子節點採用 0 作為標記符,就能完整建立...