二叉樹的建立 三種(遞迴 非遞迴)遍歷方法

2021-07-03 04:28:07 字數 2388 閱讀 9203

二叉樹定義:

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 ...