滿二叉樹肯定是完全二叉樹,完全二叉樹不一定是滿二叉樹
二叉樹的遍歷
先序遍歷:也叫做先根遍歷、前序遍歷,首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左、右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹,如果二叉樹為空則返回。
中序遍歷:首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。在遍歷左、右子樹時,仍然先遍歷左子樹,再訪問根結點,最後遍歷右子樹。
後序遍歷:首先遍歷左子樹,然後遍歷右子樹,最後訪問根結點,在遍歷左、右子樹時,仍然先遍歷左子樹,然後遍歷右子樹,最後遍歷根結點。
層序遍歷:按二叉樹的每一層的順序來遍歷,也就是先訪問根,然後訪問第一層,接著訪問第二層。
1. 先序遍歷:1->2->4->8->9->5->10->3->6->7
2. 中序遍歷:8->4->9->2->10->5->1->6->3->7
3. 後序遍歷:8->9->4->10->5->2->6->7->3->1
4. 層序遍歷:1->2->3->4->5->6->7->8->9->10
遍歷方式**實現(以標準二叉樹為例,且標號從1到n)
先序遍歷
中序遍歷
後序遍歷
可以發現,我們只要換一下dfs裡語句的順序,就能實現不同的遍歷方式
其中,知道了中序和先序,可以求出後序,知道了中序和後序,可以求先序
已知先序和中序,求後序(輸入為字元形式)
#include using namespace std;
#define mst(a,b) memset((a),(b),sizeof(a))
#define f(i,a,b) for(int i=(a);i
typedef long long ll;
const int maxn = 100005;
const int mod = 475;
const ll inf = 0x3f3f3f3f;
const double eps = 1e-6;
#define rush() int t;scanf("%d",&t);while(t--)
char pre[maxn],in[maxn],post[maxn]; //分別代表先序,中序和後序
void build(int n,char *pre,char *in,char *post)
int main()
return 0;
}
已知中序和後序求層序
#include #include #include #include #include #include using namespace std;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int t;scanf("%d",&t);while(t--)
typedef long long ll;
const int maxn = 100005;
const ll mod = 1e9+7;
const ll inf = 1e18;
const double eps = 1e-6;
int n,m;
int a[maxn];
int b[maxn];
int left[maxn],right[maxn];
int build(int la,int ra,int lb,int rb)
}if(ans)
return rt;
}void dfs(int rt)
}int main()
for(int i=1;i<=n;i++)
int rt=build(1,n,1,n);
dfs(rt);
puts("");
}
二叉樹及其遍歷
二叉樹是乙個很重要的儲存結構,所以和大家分享一下我對二叉樹的理解並結合 希望讓大家都能對二叉樹有乙個最清晰的認識 首先,二叉樹是每個節點最多有兩個子樹的樹結構,這是二叉樹的定義,二叉樹的結構如下圖 可以看到二叉樹必要的是根節點,也就是a,每個節點都會有左子節點和右子節點,那麼從b開始看,它又是乙個二...
二叉樹及其應用 二叉樹遍歷
給定二叉樹的廣義表表示,構造二叉樹並輸出二叉樹的四種遍歷順序。輸入說明 輸入僅一行,該行僅由 以及大小寫字元構成的二叉樹的廣義表表示,字串長度不超過100。輸出說明 在接下來的四行中依行輸出二叉樹的四種遍歷 輸入樣列 a b d,c e,f h 輸出樣列 abdcefh dbaecfh dbehfc...
排序二叉樹及其遍歷
所謂建立排序二叉樹就是,就是將各結點資料元素順序插到一棵二叉樹中,在插入的過程中,始終保持二叉樹中每個結點的值都大於其左子樹上每個結點的值,而小於或等於其右子樹上每個結點的值,每個結點資訊包括結點資料 結點值 左子樹指標 右子樹指標。程式執行的過程中,bt指標始終指向根結點,p指標指向當前已找到的結...