二叉树
// 孩子兄弟表示法
typedef char elemtype;
typedef struct tree_node {
elemtype data;
struct tree_node *first_child, *right_sib;
}tree_node, *link_tree_node;
建立
交互式
#include<iostream>
using namespace std;
#include<math.h>
#include<stdlib.h>
#include<string>
// 孩子兄弟表示法
typedef char elemtype;
typedef struct tree_node {
elemtype data;
struct tree_node *first_child, *right_sib;
}tree_node, *link_tree_node;
void create_bi_tree(link_tree_node& head);
void pre_order_traverse(link_tree_node head);
int main() {
string chars = "ab#d##c##";// 先序遍历序列
cout << chars.length() << endl;
link_tree_node head;
create_bi_tree(head);
pre_order_traverse(head);
system("pause");
return 0;
}
// 注意点 以 引用方式传递;
void create_bi_tree(link_tree_node& head) {
elemtype temp;
cout << "输入当前树根节点" << endl;
cin >> temp;
if (temp != '#') {
head = new tree_node;
if (!head) exit(OVERFLOW);
head->data = temp;
create_bi_tree(head->first_child);// 左树
create_bi_tree(head->right_sib); // 右树
}
else head = NULL;
}
void pre_order_traverse(link_tree_node head) {
if (head == NULL) return;
cout << head->data << ' ';
pre_order_traverse(head->first_child);
pre_order_traverse(head->right_sib);
}
静态
#include<iostream>
using namespace std;
#include<math.h>
#include<stdlib.h>
#include<string>
// 孩子兄弟表示法
typedef char elemtype;
typedef struct tree_node{
elemtype data;
struct tree_node *first_child,*right_sib;
}tree_node,*link_tree_node;
void create_bi_tree(link_tree_node& head,string chars,int serial=1);
void pre_order_traverse(link_tree_node head);
int main(){
string chars=" abcdefg########"; // 层序遍历 以满二叉树为准
link_tree_node head;
cout<<"满二叉树层序序列:"<<chars<<endl;
create_bi_tree(head,chars,1);
cout<<"先序遍历递归算法"<<endl;
pre_order_traverse(head);
return 0;
}
void create_bi_tree(link_tree_node& head,string chars,int serial){
if(chars[serial]!='#'){
head = new tree_node;
if(!head) exit(OVERFLOW);
head->data = chars[serial];
create_bi_tree(head->first_child,chars,2*serial);// 左树
create_bi_tree(head->right_sib,chars,2*serial+1); // 右树
}
else head = NULL;
}
void pre_order_traverse(link_tree_node head){
if(head == NULL) return ;
cout<<head->data<<' ';
pre_order_traverse(head->first_child);
pre_order_traverse(head->right_sib);
}
遍历
递归式
先序
// 先序遍历 DLR
void pre_order_traverse(link_tree_node head){
if(head == NULL) return ;
cout<<head->data<<' ';
pre_order_traverse(head->first_child);
pre_order_traverse(head->right_sib);
}
中序
// 中序遍历 LDR
void mid_order_traverse(link_tree_node head){
if(head == NULL) return ;
mid_order_traverse(head->first_child);
cout<<head->data<<' ';
mid_order_traverse(head->right_sib);
}
后序
// 后序遍历 LRD
void back_order_traverse(link_tree_node head){
if(head == NULL) return ;
back_order_traverse(head->first_child);
back_order_traverse(head->right_sib);
cout<<head->data<<' ';
}
整体代码
#include<iostream>
using namespace std;
#include<math.h>
#include<stdlib.h>
#include<string>
// 孩子兄弟表示法
typedef char elemtype;
typedef struct tree_node{
elemtype data;
struct tree_node *first_child,*right_sib;
}tree_node,*link_tree_node;
void create_bi_tree(link_tree_node& head,string chars,int serial=1);
void pre_order_traverse(link_tree_node head);
void mid_order_traverse(link_tree_node head);
void back_order_traverse(link_tree_node head);
int main(){
string chars=" abcdefg########"; // 层序遍历 以满二叉树为准
link_tree_node head;
cout<<"满二叉树层序序列:"<<chars<<endl;
create_bi_tree(head,chars,1);
cout<<"先序遍历递归算法"<<endl;
pre_order_traverse(head);
cout<<endl;
cout<<"中序遍历递归算法"<<endl;
mid_order_traverse(head);
cout<<endl;
cout<<"后序遍历递归算法"<<endl;
back_order_traverse(head);
return 0;
}
void create_bi_tree(link_tree_node& head,string chars,int serial){
if(chars[serial]!='#'){
head = new tree_node;
if(!head) exit(OVERFLOW);
head->data = chars[serial];
create_bi_tree(head->first_child,chars,2*serial);// 左树
create_bi_tree(head->right_sib,chars,2*serial+1); // 右树
}
else head = NULL;
}
// 先序遍历 DLR
void pre_order_traverse(link_tree_node head){
if(head == NULL) return ;
cout<<head->data<<' ';
pre_order_traverse(head->first_child);
pre_order_traverse(head->right_sib);
}
// 中序遍历 LDR
void mid_order_traverse(link_tree_node head){
if(head == NULL) return ;
mid_order_traverse(head->first_child);
cout<<head->data<<' ';
mid_order_traverse(head->right_sib);
}
// 后序遍历 LRD
void back_order_traverse(link_tree_node head){
if(head == NULL) return ;
back_order_traverse(head->first_child);
back_order_traverse(head->right_sib);
cout<<head->data<<' ';
}
非递归
先序 – 自上而下— 右子树根节点入栈
更好
// 先序非递归遍历
void pre_order_stack(link_tree_node head){
if(head == NULL) return;
stack<link_tree_node> s;
link_tree_node p=head;
while(p||!s.empty()){
while(p){
cout<<p->data<<" ";
s.push(p);
p=p->first_child;
}
if(!s.empty()){
p=s.top();
p=p->right_sib;
s.pop();
}
}
}
// 先序非递归遍历
void pre_order_stack(link_tree_node head){
if(head == NULL) return;
stack<link_tree_node> s;
link_tree_node p=head;
while(p||!s.empty()){
if(p->right_sib) s.push(p->right_sib);
cout<<p->data<<" ";
if(p->first_child){
p=p->first_child;
}else{
p = NULL;
if (!s.empty())
{
p = s.top(); s.pop();
}
}
}
}
整体代码
#include<iostream>
#include<string>
using namespace std;
#include<math.h>
#include<stdlib.h>
#include<stack>
// 孩子兄弟表示法
typedef char elemtype;
typedef struct tree_node{
elemtype data;
struct tree_node *first_child,*right_sib;
}tree_node,*link_tree_node;
void create_bi_tree(link_tree_node& head,string chars,int serial=1);
void pre_order_stack(link_tree_node head);
void pre_order_traverse(link_tree_node head);
int main(){
string chars=" abcdefg########"; // 层序遍历 以满二叉树为准 abcdefg########
link_tree_node head;
cout<<"满二叉树层序序列:"<<chars<<endl;
create_bi_tree(head,chars,1);
cout<<"先序遍历递归算法"<<endl;
pre_order_traverse(head);
cout<<endl;
cout<<"先序遍历非递归算法"<<endl;
pre_order_stack(head);
return 0;
}
void create_bi_tree(link_tree_node& head,string chars,int serial){
if(chars[serial]!='#'){
head = new tree_node;
if(!head) exit(OVERFLOW);
head->data = chars[serial];
create_bi_tree(head->first_child,chars,2*serial);// 左树
create_bi_tree(head->right_sib,chars,2*serial+1); // 右树
}
else head = NULL;
}
// 先序递归遍历
void pre_order_traverse(link_tree_node head){
if(head == NULL) return ;
cout<<head->data<<' ';
pre_order_traverse(head->first_child);
pre_order_traverse(head->right_sib);
}
// 先序非递归遍历
void pre_order_stack(link_tree_node head){
if(head == NULL) return;
stack<link_tree_node> s;
link_tree_node p=head;
while(p||!s.empty()){
if(p->right_sib) s.push(p->right_sib);
cout<<p->data<<" ";
if(p->first_child){
p=p->first_child;
}else{
p = NULL;
if (!s.empty())
{
p = s.top(); s.pop();
}
}
}
}
中序 – 自下而上— 当前树根节点入栈
// 中序非递归遍历
void mid_order_stack(link_tree_node head) {
if (head == NULL) return;
stack<link_tree_node> s;
link_tree_node p = head;
// 判断当前树是否为空 且树为空 栈是否为空
while (p || !s.empty()) {
// 找当前树左叶节点 即子树根节点
while (p) {
s.push(p);
p = p->first_child;
}
if(p) cout << p->data << " "; // 左右子树叶节点
if (!s.empty()) { // 返回 双亲节点
p = s.top();
cout << p->data << " "; // 当前根节点
s.pop();
p = p->right_sib;
}
else p = p->right_sib; // 仅余根节点时
}
}
整体代码
#include<iostream>
#include<string>
using namespace std;
#include<math.h>
#include<stdlib.h>
#include<stack>
// 孩子兄弟表示法
typedef char elemtype;
typedef struct tree_node {
elemtype data;
struct tree_node *first_child, *right_sib;
}tree_node, *link_tree_node;
void create_bi_tree(link_tree_node& head, string chars, int serial = 1);
void mid_order_stack(link_tree_node head);
void mid_order_traverse(link_tree_node head);
int main() {
string chars = " abcdefg########"; // 层序遍历 以满二叉树为准 abcdefg########
link_tree_node head;
cout << "满二叉树层序序列:" << chars << endl;
create_bi_tree(head, chars);
cout << "中序遍历递归算法" << endl;
mid_order_traverse(head);
cout << endl;
cout << "中序遍历非递归算法" << endl;
mid_order_stack(head);
return 0;
}
void create_bi_tree(link_tree_node& head, string chars, int serial) {
if (chars[serial] != '#') {
head = new tree_node;
if (!head) exit(OVERFLOW);
head->data = chars[serial];
create_bi_tree(head->first_child, chars, 2 * serial);// 左树
create_bi_tree(head->right_sib, chars, 2 * serial + 1); // 右树
}
else head = NULL;
}
// 中序遍历 LDR
void mid_order_traverse(link_tree_node head) {
if (head == NULL) return;
mid_order_traverse(head->first_child);
cout << head->data << ' ';
mid_order_traverse(head->right_sib);
}
// 中序非递归遍历
void mid_order_stack(link_tree_node head) {
if (head == NULL) return;
stack<link_tree_node> s;
link_tree_node p = head;
// 判断当前树是否为空 且树为空 栈是否为空
while (p || !s.empty()) {
// 找当前树左叶节点 即子树根节点
while (p) {
s.push(p);
p = p->first_child;
}
if (!s.empty()) { // 返回 双亲节点
p = s.top();
cout << p->data << " "; // 当前根节点
s.pop();
p = p->right_sib;
}
else p = p->right_sib; // 仅余根节点时
}
}
后序
#include<iostream>
#include<string>
using namespace std;
#include<math.h>
#include<stdlib.h>
#include<stack>
#include<utility>
// 孩子兄弟表示法
typedef char elemtype;
typedef struct tree_node {
elemtype data;
struct tree_node *first_child, *right_sib;
}tree_node, *link_tree_node;
void create_bi_tree(link_tree_node& head, string chars, int serial = 1);
void back_order_stack(link_tree_node head);
void back_order_traverse(link_tree_node head);
int main() {
string chars = " abcdefg########"; // a层序遍历 以满二叉树为准 abcdefg########
link_tree_node head;
cout << "满二叉树层序序列:" << chars << endl;
create_bi_tree(head, chars);
cout << "后序遍历递归算法" << endl;
back_order_traverse(head);
cout << endl;
cout << "后序遍历非递归算法" << endl;
back_order_stack(head);
system("pause");
return 0;
}
void create_bi_tree(link_tree_node& head, string chars, int serial) {
if (chars[serial] != '#') {
head = new tree_node;
if (!head) exit(OVERFLOW);
head->data = chars[serial];
create_bi_tree(head->first_child, chars, 2 * serial);// 左树
create_bi_tree(head->right_sib, chars, 2 * serial + 1); // 右树
}
else head = NULL;
}
// 后序遍历 LRD
void back_order_traverse(link_tree_node head) {
if (head == NULL) return;
back_order_traverse(head->first_child);
back_order_traverse(head->right_sib);
cout << head->data << ' ';
}
// 后序非递归遍历
void back_order_stack(link_tree_node head) {
if (head == NULL) return;
stack<pair<link_tree_node, bool> > s;
s.emplace(make_pair(head, false));
bool visited;
while (!s.empty()) {
head = s.top().first;
visited = s.top().second;
s.pop();
if (head == NULL) continue;
if (visited) cout << head->data<<" ";
else {
s.emplace(make_pair(head, true));
s.emplace(make_pair(head->right_sib,false));
s.emplace(make_pair(head->first_child,false));
}
}
}
传送门
C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本
C++二叉树前中后序遍历(递归&非递归)统一代码格式
C++ 中序遍历非递归实现
C++ STACK与pair的基本用法
关于C++ pair 和make_pair的用法
C++11容器中新增加的emplace相关函数的使用
c++11 之emplace_back 与 push_back的区别
C++优化:使用emplace
Template within template: why “`>>‘should be > >’ within a nested template argument list” 解决方法