二叉樹定義:
1.有且僅有乙個特定的稱之為根root的結點
2.當n>1時,除根結點之外的其餘結點分為兩個互不相交的子集。他們稱為二叉樹的左子樹和右子樹。
二叉樹的一種建立方法:
若對有n個結點的完全二叉樹進行順序編號(1<=i<=n),那麼,對於編號為i(i>=1)的結點。
當i=1時,該結點為根,它無雙親結點;
當i>1時,該節點的雙親編號為[i/2];
若2i<=n,該結點為編號為2i的左孩子,否則沒有左孩子
當2i+1<=n,該結點有編號為2i+1的右孩子,否則沒有右孩子
利用上個性質,對任意二叉樹,先按滿二叉樹對其所有結點進行編號。
注意:由於此樹並非完全樹,所以結點的編號並不連續。
遍歷二叉樹:
遍歷二叉樹是指以一定的次序訪問二叉樹中的每個結點,並且每個結點僅被訪問一次,訪問結點是指進行各種操作的簡稱。3種遍歷次序:中根遍歷二叉樹、先根遍歷二叉樹、後根遍歷二叉樹。
遞迴演算法:
先根遍歷:如果根不為空,1.訪問根結點2.按先根次序遍歷左子樹,3.按先根次序遍歷右子樹,否則返回。
中根遍歷:如果根不為空,1.按中根次序遍歷左子樹,2.訪問根結點,3.按中根次序遍歷右子樹,否則返回。
後根遍歷:如果根不為空,1.按後根次序遍歷左子樹,2.按後根次序遍歷右子樹,3.訪問根結點,否則返回。
中根遍歷非遞迴演算法:
需要人為設定乙個棧來存放所經過的根結點的指標(棧我圖簡單,直接呼叫stl標準庫的),第一次遇到根結點並不訪問,而是如棧,然後中根遍歷左子樹。左子樹遍歷結束後,第二次遇到根結點,退棧並訪問該結點。然後遍歷右子樹。
先根遍歷非遞迴演算法:同中根遍歷非遞迴演算法,只是把輸出位置提前
後根遍歷非遞迴演算法:
廢話少說,上**......
binarytree.h
#ifndef binarytree_h_
#define binarytree_h_
typedef int t;
struct node
;class binarytree
void inorder();
void inorder()
void postorder();
void postorder()
private:
void inorder(node *p);
void preorder(node *p);
void postorder(node *p);
void destroy(node *p);
};#endif
binarytree.cpp
#include "binarytree.h"
#include #include using namespace std;
binarytree::binarytree()
binarytree::~binarytree()
void binarytree::inorder(node *p)
}//非遞迴法實現中根遍歷
void binarytree::inorder()
p=s.top();
s.pop();
coutp=p->rch;
}while(!(s.empty() && p==null));
}//先根遍歷,用遞迴法
void binarytree::preorder(node *p)
}//先根遍歷的非遞迴演算法
void binarytree::preorder()
p=s.top();
p=p->rch;
s.pop();
}while(!(s.empty() && p==null));
}//後根
void binarytree::postorder(node *p)
}//非遞迴法實現後根遍歷
void binarytree::postorder()
t=s.top();
if(t==2)
if(!s.empty())
if(t==1)
}while(!(s.empty() && p==null));
}void binarytree::destroy(node *p)
}void binarytree::create()
else
else
}cout<<"i,x = "; cin>>i>>x;
} cout<<"二叉樹建立完畢!"<
//直接呼叫stl庫中的棧吧,不在
#include "binarytree.h"
#include using namespace std;
int main()
{ /*cout<<"hello,world"<
二叉樹的三種非遞迴遍歷
一.前序遍歷 前序遍歷按照 根結點 左孩子 右孩子 的順序進行訪問。1.遞迴實現 void preorder1 bintree root 遞迴前序遍歷 2.非遞迴實現 根據前序遍歷訪問的順序,優先訪問根結點,然後再分別訪問左孩子和右孩子。即對於任一結點,其可看做是根結點,因此可以直接訪問,訪問完之後...
二叉樹的三種非遞迴遍歷
遞迴演算法和非遞迴演算法的轉換 可以借助棧,將二叉樹的遞迴演算法轉換為非遞迴演算法,下面以中序遍歷為例給出中序遍歷的非遞迴演算法。先掃瞄 並非訪問 根結點的所有左結點並將他們一一進棧。然後出戰乙個結點 p 顯然結點 p沒有左孩子結點或者左孩子結點均已訪問過 則訪問它。然後掃瞄該結點的有孩子結點,將其...
二叉樹的三種非遞迴遍歷
struct treenode 一 前序輸出二叉樹 void preorder treenode root p stk.top stk.pop p p right 二 中序輸出二叉樹 void midorder treenode root p stk.top cout void postorder ...