1. 程式人生 > >根據中序和層次遍歷序列,構造二叉樹

根據中序和層次遍歷序列,構造二叉樹

程式碼如下,思路詳見註釋:

#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