宣告:為了封裝性,下面所有的遞迴函式都設為私有,用乙個公有方法呼叫。
#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...