二叉樹建立及部分操作

2021-10-01 18:58:31 字數 2891 閱讀 4606

宣告:為了封裝性,下面所有的遞迴函式都設為私有,用乙個公有方法呼叫

#include#include#include using namespace std;

//定義節點

templateclass tree_node

;templateclass tree

else

} //前序遞迴遍歷的函式

void _preorder(tree_node*r)const }

//中序遞迴遍歷

void _inorder(tree_node*r)const }

//後序遞迴遍歷

void _postorder(tree_node*r)const }

//返回二叉樹的節點個數

size_t node(tree_node* r)const

return count;

} //返回二叉樹的深度

size_t getdepth(tree_node* r)const

size_t left_deep = 1 + getdepth(r->left);

size_t right_deep = 1 + getdepth(r->right);

if (left_deep > right_deep)

else

} //返回二叉樹葉子節點個數

size_t get_leaf(tree_node* r)const

if (r->left == nullptr && r->right == nullptr)

count += 0 + get_leaf(r->left) + get_leaf(r->right);

return count;

} //前序和中序構造二叉樹

tree_node* pre_and_inorder(const vector& prev, int prev_begin, int prev_end, const vector& inorder, int inorder_begin, int inorder_end)

if (prev_begin > prev_end || inorder_begin > inorder_end)

tree_node* root = new tree_node;

root->data = prev[prev_begin];

for (int i = inorder_begin; i <= inorder_end; ++i)

} return root;

} //後序和中序構造二叉樹

tree_node* post_and_inorder(const vector& post, int post_begin, int post_end, const vector& inorder, int inorder_begin, int inorder_end)

if (post_end < post_begin)

tree_node* root = new tree_node;

root->data = post[post_end];

for (int i = inorder_begin; i <= inorder_end; ++i)

} return root;

} //銷毀

void destroy(tree_node*& r) }

public:

//建構函式

tree()

:_root(nullptr)

{} //前序和中序構造二叉樹

void previnorder_builttree(const vector& prev, const vector& inorder)

//後序和中序構造二叉樹

void postinorder_builttree(const vector& post, const vector& inorder)

//前序遞迴建立

void pre_create()

//前序遞迴遍歷

void preorder()

//中序遞迴遍歷

void inorder()

//後序遞迴遍歷

void postorder()

//前序非遞迴,需要用到棧

void preorder_n()const

r = t.top();

r = r->right;

t.pop();

}} cout << endl;

} //中序非遞迴

void inorder_n()

r = s.top();

cout << r->data << " ";

s.pop();

r = r->right;}}

cout << endl;

} //後序非遞迴

void postorder_n()

r = s1.top();

r = r -> left;

s1.pop();

}while (!s2.empty())

} cout << endl;

} //層序遍歷

void levelorder()const

if (temp->right != nullptr)

q.pop();

}} cout << endl;

} //返回二叉樹的深度

size_t get_depth()const

//返回二叉樹的節點個數

size_t get_treenode_num()const

//返回二叉樹的葉子節點個數

size_t get_leafnode_num()const

//析構函式

~tree() }

};

二叉樹的部分操作

本人是一名大三的老油條,第一次寫部落格,想記錄一下最近的學過的東西。1 先序遍歷 dlr 1 使用遞迴 核心 system.out.println root.value this.firstbianli root.leftchild 遞迴呼叫 this.firstbianli root.rightc...

建立二叉樹 後序建立二叉樹

由後序遍歷可知,輸入順序是左結點 右結點 子樹根結點 比如輸入如下樹 ab cde 輸入序列為 e d b c a 思路 使用棧,對左結點和右結點進行壓棧 1.當輸入遇到非 且棧中元素大於等於2,則可以確定乙個小三角樹形,並將這個樹根作為下乙個小三角樹形的乙個子節點 2.當輸入遇到非 但棧中元素小於...

二叉樹的建立及相應操作

下面是用鍊錶做的乙個二叉樹,包含了二叉樹的建立 先序遍歷,中序遍歷,後序遍歷的遞迴操作和非遞迴操作,還有求二叉樹的的高度,根節點到某一節點的路徑,葉子結點個數和總節點個數。萬年的標頭檔案 include include include define max tree size 100 using n...