二叉樹的建立的記憶體問題

2021-07-06 04:39:44 字數 2382 閱讀 9595

下面的二叉樹建立**是有問題的:

#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 作為標記符,就能完整建立...