根據中序和層次遍歷序列,構造二叉樹
程式碼如下,思路詳見註釋:
#include<stdio.h> #include<iostream> #include<queue> using namespace std; typedef struct Bitree{ char data; struct Bitree *lchild; struct Bitree *rchild; }Bitree,*Bi; typedef struct{ int lel; //指向當前處理的元素在層次序列中的位置 int low,high; //中序序列的上下界 Bi parent; //層次序列中當前結點的雙親結點指標 int lr; //判斷左右子樹,1為左,2為右 }Sq; void preorder(Bi p); void Creat(Bi &bt,char lev[],char in[],int n) { Sq q; queue <Sq> Q; if(n<1) bt=NULL; //二叉樹為空 else { int i,s; i=s=0; //s指向層次序列中當前處理的元素,i用來尋找當前處理的元素在中序序列中的位置 bt=new Bitree; bt->data=lev[0]; bt->lchild=bt->rchild=NULL; while(in[i]!=lev[0]) i++; if(i==0 && i==n-1) return ; //只有一個根節點 if(i==0) //沒有左子樹 { bt->lchild=NULL; q.lel=++s; q.low=i+1; q.high=n-1; q.lr=2; q.parent=bt; Q.push(q); } else if(i==n-1) //沒有右子樹 { bt->rchild=NULL; q.lel=++s; q.low=0; q.high=i-1; q.lr=1; q.parent=bt; Q.push(q); } else { q.lel=++s; q.low=0; q.high=i-1; q.lr=1; q.parent=bt; Q.push(q); q.lel=++s; q.low=i+1; q.high=n-1; q.lr=2; q.parent=bt; Q.push(q); } while(!Q.empty()) { q=Q.front(); Q.pop(); Bi fat=q.parent; i=q.low; while(in[i]!=lev[q.lel]) i++; Bi p=new Bitree; p->data=lev[q.lel]; p->lchild=p->rchild=NULL; if(q.lr==1) fat->lchild=p; else fat->rchild=p; if(i==q.low && i==q.high) //葉子結點,無孩子 { p->lchild=p->rchild=NULL; continue; } else if(i==q.low) //沒有左孩子 { p->lchild=NULL; q.lel=++s; q.low=i+1; q.parent=p; q.lr=2; Q.push(q); } else if(i==q.high) //沒有右孩子 { p->rchild=NULL; q.lel=++s; q.high=i-1; q.parent=p; q.lr=1; Q.push(q); } else { int high=q.high; //備份一下 q.lel=++s; q.high=i-1; q.parent=p; q.lr=1; Q.push(q); q.lel=++s; q.low=i+1; q.high=high; q.parent=p; q.lr=2; Q.push(q); } } } } int main() { int n; Bitree *B; char in[50],lev[50]; printf("請輸入結點個數\n"); cin>>n; printf("請輸入中序遍歷和層次遍歷\n"); getchar(); gets(in); gets(lev); Creat(B,lev,in,n); printf("構造完成,輸出先序序列\n"); preorder(B); return 0; } void preorder(Bi p) { if(p) { printf("%c ",p->data); preorder(p->lchild); preorder(p->rchild); } }
相關推薦
根據中序和層次遍歷序列,構造二叉樹
程式碼如下,思路詳見註釋: #include<stdio.h> #include<iostream> #include<queue> using namespace std; typedef struct Bitree{ char d
通過先序和中序遍歷序列來構造二叉樹
給出一棵二叉樹的先序和中序遍歷的序列,構造出該二叉樹。 思路一:採用分治法。 1)取先序遍歷序列的第一個值,用該值構造根結點,,然後在中序遍歷序列中查詢與該元素相等的值,這樣就可以把序列分為三部分:左
通過樹的先序和中序遍歷序列來構造二叉樹
題目:給出一棵二叉樹的先序和中序遍歷的序列,構造出該二叉樹。 思路一:採用分治法。 1)取先序遍歷序列的第一個值,用該值構造根結點,,然後在中序遍歷序列中查詢與該元素相等的值,這樣就可以把序列分為三部分:左子樹(如果有)、根結點和右子樹(如果有)。 2)將兩個序列都分成三部
將一個數組中的各節點按照層次遍歷插入構成完全二叉樹
按層次構建完全二叉樹 (本人入門水平,這是我的第一篇部落格,希望通過寫寫部落格能增強自己的理解,同時也能給大家提供一些力所能及的幫助,通過這個平臺共同進步,有錯誤的地方希望各位大佬指出來,我會努力改正的,謝謝大家!) 1.主要思想: 由於是層次
郝斌資料結構入門--P70-樹 已知兩種遍歷序列求原始二叉樹
郝斌資料結構入門--P70-樹 已知兩種遍歷序列求原始二叉樹 已知先序、中序、後序任何一種序列,不能夠找到原始二叉樹。 經過研究發現,已知一棵樹的兩種序列,可以把二叉樹求出來。 也經過研究發現,已知先序和後序,無法還原出原始的二叉樹。 最終表明,通過 先
二叉樹的遍歷:前序、中序、後序和層次遍歷
層次遍歷 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNo
由二叉樹的後序和中序求層次遍歷
PAT 1020 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences
(C語言版)二叉樹遍歷演算法——包含遞迴前、中、後序和層次,非遞迴前、中、後序和層次遍歷共八種
#include <stdlib.h> #include <stdio.h> #include "BiTree.h" #include "LinkStack.h" #include "LinkQueue.h" //初始化二叉樹(含根節點) void InitBiTree(pBiTr
[Leetcode] Construct binary tree from inorder and postorder travesal 利用中序和後續遍歷構造二叉樹
post right clas end opened tree 數組 isp solution Given inorder and postorder traversal of a tree, construct the binary tree. Note: You ma
已知二叉樹的先序遍歷和中序遍歷畫出該二叉樹
對一棵二叉樹進行遍歷,我們可以採取3中順序進行遍歷,分別是前序遍歷、中序遍歷和後序遍歷。 這三種方式是以訪問父節點的順序來進行命名的。 假設父節點是N,左節點是L,右節點是R,那麼對應的訪問遍歷順序如下: 前序遍歷 N->L->R 中序遍歷
二叉樹遍歷演算法(遞迴實現先序中序和後續遍歷)(非遞迴實現中序和先續)
二叉樹遍歷 這兩天抓緊把二叉樹遍歷複習了一遍,遞迴實現還是一如既往地簡潔,迭代版本寫了好久還是隻實現了先序和中序,後續一直沒搞明白,有空了再更新。 遞迴實現 void RecursionBackTree(TreeNode * root) {
求二叉樹的層次遍歷(先加中序還原 + 層次遍歷)
求二叉樹的層次遍歷 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一顆二叉樹的前序遍歷和中序遍歷,求二叉樹的層次遍歷。 Input 輸入資料有多組,輸入T,代表有T組測試資料。
二叉樹的前序中序和後續遍歷及應用場景
二叉樹的結構定義 public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) {
二叉樹 已知前序中序兩個序列,建立二叉樹(中序和後序也有)
本文主要講二叉樹的建樹,具體的說就是,題目給出你二叉樹的前序和中序,你來建樹,還有一個題目是給出中序和後序來建樹 第一題:A binary tree is a finite set of vertices that is either empty or consists
擴充套件的先序遍歷序列建立以二叉連結串列方式儲存的二叉樹,後序遍歷
1. 請根據使用者輸入的“擴充套件的先序遍歷序列”(用小圓點表示空子樹),建立以二叉連結串列方式儲存的二叉樹,然後寫出後序遍歷該二叉樹的非遞迴演算法,並將對應的程式除錯執行通過。 #include<stdio.h> #include<std
已知二叉樹的前序和中序序列,構建二叉樹並求後序序列,java實現。
已知二叉樹的前序和中序序列,或者已知二叉樹的後序和中序序列,是能夠唯一確定一棵二叉樹的。但是如果僅知道二叉樹的前序和後序序列,一般是不能唯一確定一棵二叉樹的,但是可以分析有多少種可能的二叉樹,這個沒有具體研究,只知道節點少的情況還能湊合分析出來,但是節點多的情況下可能性太多
給出先序和中序序列,還原二叉樹的規律方法
已知先序序列:A B C D E F G H I 中序序列;B C A E D G H F I還原二叉樹的結構。首先,我們要根據先序序列和中序序列的特點:先序序列是先訪問節點的值,然後是左孩子,其次是右孩子;而中序序列是先訪問左孩子,再訪問節點的值,再訪問右孩子。根據這個規律
層次遍歷二叉樹以及遍歷第K層二叉樹
層次遍歷的時候用到了,STL中的佇列。 void LevelOrder(BtNode *ptr) { queue<BtNode*> que; que.push(ptr); while (!que.empty()) {
先序遍歷建立並輸出二叉樹(遞迴演算法)
//程式碼如下: #include<stdio.h> #include<stdlib.h> typedef struct Node //二叉樹結構定義 {
二叉樹的創建、遍歷、判斷子二叉樹
stat 技術 get sys 找到 btree gif public str 1、二叉樹節點類 public class TreeNode { int val = 0; TreeNode left = null; TreeNode right