資料結構 二叉樹的遞迴與非遞迴建立和遍歷

2021-07-23 10:08:12 字數 4191 閱讀 1410

下面**所用到的測試用例畫成樹的樣子長這樣:

建立樹時給的是陣列,用『#』代表非法值,即該結點為空。

二叉樹的遞迴實現:

#pragma once

#include#includeusing namespace std;

templatestruct binarytreenode

t _value;

binarytreenode* _left;

binarytreenode* _right;

};templateclass binarytree

binarytree(t* a, size_t size, const t& invalid)

binarytree(const binarytree& bt)

binarytree& operator=(binarytree& bt) }

~binarytree()

void prevorder()

void inorder()

void postorder()

void levelorder() //層序遍歷

size_t size()

size_t depth()

size_t leafsize()

size_t getklevel(size_t k) //第k層結點個數

protected:

node* _distory(node* root)

return root;

} node* _creattree( t*a, size_t size,size_t& index,const t& invalid)

return root;

} node* _copy(node* copyroot)

return root;

} node* _prevorder(node* root)

return root;

} node* _inorder(node* root)

return root;

} node* _postorder(node* root)

return root;

} void _levelorder(node* root) }

size_t _size(node* root)

return size;

} size_t _depth(node* root)

return depth1 > depth2 ? depth1 : depth2;

} size_t _leafsize(node* root)

private:

node* _root;

};void test()

; int array1[15] = ;

binarytreebt(array, 10, '#');

bt.prevorder();

bt.inorder();

bt.postorder();

cout << bt.size() << endl;

cout << bt.depth() << endl;

cout << bt.leafsize() << endl;

binarytreebt2(array1, 15, '#');

cout << bt2.depth() << endl;

cout << bt2.leafsize() << endl;

binarytreebt3(bt);

bt3.prevorder();

binarytreebt4=bt3;

bt4.prevorder();

bt4.levelorder();

}

遞迴的好處在於**簡練。但遞迴不容易理解。

非遞迴的二叉樹(面試經常會考的):

#pragma once

#include#include#include#includeusing namespace std;

templatestruct binarytreenode

t _value;

binarytreenode* _left;

binarytreenode* _right;

};templateclass binarytree

explicit binarytree(t* a, size_t size, const t& invalid) //建構函式,建立一棵樹。

else

s.push(cur);

}index++;

node* top = s.top();

s.pop();

if ((index < size) && (a[index] != invalid))

}} binarytree(const binarytree& bt) //拷貝構造

else

cur = cur->_left;

s1.push(root);

}node* top = s.top();

node* top1 = s1.top();

s.pop();

s1.pop();

cur = top->_right;

if (cur)

}} binarytree& operator=(binarytreebt)

void prevordernor()

node* top = s.top();

s.pop();

cur = top->_right;

} cout << endl;

} void inordernor()

node* top = s.top();

s.pop();

cout << top->_value << " ";

cur = top->_right;

} cout << endl;

} void postordernor()

node* top = s.top();

if ((top->_right == null) || (prev == top->_right))

else

cur = top->_right;

} cout << endl;

} size_t sizenor()

node* top = s.top();

s.pop();

cur = top->_right;

} return size;

} size_t depthnor()

if (cur->_right)

if (levenum == visitnum)

}return depth;

} size_t levenum() //葉子節點個數

node* top = s.top();

s.pop();

cur = top->_right;

} return count;

} size_t getkleve(size_t k) //得到第k層結點個數。

if (cur->_right)

if (levenum == visitnum)

}return nodenum - visitnum;

}private:

node* _root;

};void test()

; binarytreebt(array, 10, '#');

bt.prevordernor();

bt.inordernor();

bt.postordernor();

binarytreebt1(bt);

bt1.prevordernor();

binarytreebt2 = bt1;

bt2.prevordernor();

cout << bt.sizenor() << endl;

cout << bt.depthnor() << endl;

cout << bt.levenum() << endl;

cout << bt.getkleve(3) << endl;

}

可以看到,非遞迴相對來說**量能多點,但是比較容易理解,而且幾個遍歷過程**十分相似,理解其中乙個,後面幾個都是類似的。

資料結構 二叉樹的遞迴 非遞迴遍歷

複習一下二叉樹遞迴非遞迴的先中後序遍歷 寫非遞迴後序遍歷的時候卡殼了,參考了一下網上的思路,大概有兩種,一種是標記每個節點是否有走過,如果父節點的左右子節點都標記訪問過,則可以訪問父節點 一種是定義乙個指標,指向上乙個訪問的節點,如果某父節點的右子節點為null或者是上乙個訪問的節點,則該父節點應當...

資料結構 18 二叉樹(非遞迴)

二叉樹 使用非遞迴方法,建立樹 前中後序及層級遍歷樹。建立樹時,按照左子樹小於樹根,右子樹大於樹根,這樣中序遍歷就是有序表 include include 層級遍歷時,用到了queue模板類 include 前中後遍歷時,用到了stack模板類 using namespace std class n...

二叉樹的遞迴與非遞迴

include include include include using namespace std templatestruct binarytreenode template class binarytree binarytree t a,size t n,const t invalid bi...