1. 程式人生 > >根據先序遍歷和中序遍歷建立二叉樹

根據先序遍歷和中序遍歷建立二叉樹

演算法思想

先序遍歷的順序是根左右,中序遍歷的順序是左根右。根據這一特性,先序遍歷的第一個元素肯定是根節點。所以我們只要在中序遍歷中找到該根節點的值,根節點以左就是它的左子樹,根節點以右就是它的右子樹,然後就可以遞迴的方式建立二叉樹

假設現在有一顆二叉樹如下
這裡寫圖片描述
先序序列為(18,14,7,3,11,22,35,27)
中序序列為(3,7,11,14,18,22,27,35)
首先根據先序序列得二叉樹的根節點是18,然後根據給定的先序序列可以得知18的左子樹的中序序列為(3,7,11,14,),18的右子樹的中序序列為(22,37,35),18的左子樹的先序序列為(14,7,3,11),18的右子樹的先序序列為(22,35,37),進而對18的左右子樹分別類推進行處理,便可以確定整顆二叉樹。

public static TreeNode createByPreAndIn(Object[] pre,Object[] in,int preStart,int preEnd,int inStart,int inEnd){
        TreeNode root=null;
        if(pre==null||in==null||pre.length==0||in.length==0||pre.length!=in.length||preStart>preEnd||inStart>inEnd)
            return null;
        root=new
TreeNode(pre[preStart]); int j=0; for(j=inStart;j<=inEnd;j++){ if(pre[preStart]==in[j]){ root.leftChild=createByPreAndIn(pre, in, preStart+1, preStart+j-inStart, inStart, j); root.rightChild=createByPreAndIn(pre, in, preStart+j-inStart+1
, preEnd, j+1, inEnd); } } return root; }

輸出

public static void main(String[] args) {
        Object[] pre={18,14,7,3,11,22,35,27};
        Object[] in={3,7,11,14,18,22,27,35};
        TreeNode root=createByPreAndIn(pre, in, 0, pre.length-1, 0, in.length-1);
        System.out.print("先序序列為:");
        preOrder(root);
        System.out.println();
        System.out.print("中序序列為:");
        inOrder(root);
        System.out.println();
        System.out.print("後序序列為:");
        postOrder(root);
        System.out.println();
        System.out.print("層次遍歷為:");
        levelOrder(root);
    }

相關推薦

根據建立(程式碼)

先宣告一個結構體:二叉樹的三個元素,資料域,左子樹,右子樹。 typedef char ElemType; typedef struct Node { ElemType data; struct Node *lchild,*rchild; }BitTree; 宣告函式:返回

根據建立

演算法思想 先序遍歷的順序是根左右,中序遍歷的順序是左根右。根據這一特性,先序遍歷的第一個元素肯定是根節點。所以我們只要在中序遍歷中找到該根節點的值,根節點以左就是它的左子樹,根節點以右就是它的右子樹,然後就可以遞迴的方式建立二叉樹 假設現在有一顆二叉樹如下

根據推後C語言

事實上,一箇中序遍歷的演算法中入棧的過程中,如果你把每個入棧的結點儲存起來,你會發現這些結點就是先序遍歷的結果,同樣,出棧就是中序遍歷,如下圖 核心演算法 先序遍歷的第一個結點一定是根結點,也是後序遍歷的最後一個結點,找到它在中序中的位置 i ,那麼 i

根據求後

string 第一個 tac tor att 後序 return rda post 根據前序遍歷和中序遍歷求後序遍歷 一道HULU的筆試題(How I wish yesterday once more) 假設有棵樹,長下面這個樣子,它的前序遍歷,中序遍歷,後續遍

數據結構 遞歸非遞歸方式實現

nor post 後序遍歷 order else 對象 二叉樹先序 bre print   二叉樹的先序遍歷順序是根、左、右;中序遍歷順序是左、根、右;後序遍歷順序是左、右、根。   遞歸方式實現如下: 1 public class TreeNode { 2

用遞歸非遞歸方式實現、後

壓入 功能 指南 void 一個 兩個 方法 img oid 很久沒寫博客了,也很久沒有靜下心來學習技術,具體原因不再多糾結。 最近完成零丁任務之余每天刷一刷LeetCode,看看書(比如這篇記錄的是左程雲大佬的《程序員代碼面試指南》中的內容) 溫習和學習一些算法以及相關知

(拼多多筆試演算法)根據的前確定後的兩種思路

根據二叉樹的前序遍歷和中序遍歷確定後序遍歷 輸入:第一行:結點數目 第二行:前序遍歷陣列 第三行:中序遍歷陣列 輸出 :後序遍歷陣列 例如:第一行:7 第二行:6 4 2 5 3 1 7 第三行:4 2 5 6 1 3 7 輸出 :5 2 4 1 7 3 6 我思

刷題筆記4——根據重建

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 分析 在前序遍歷中,第一個數字總

序列建立——

Description 按先序順序和中序順序輸入二叉樹的2個遍歷序列,採用二叉連結串列建立該二叉樹並用後序遍歷順序輸出該二叉樹的後序遍歷序列。 Input 輸入資料有多組,對於每組測試資料 第一行輸入二叉樹的先序序列,第二行為中序序列。 Output 對於每組測試資料輸出該二叉樹

已知畫出該

對一棵二叉樹進行遍歷,我們可以採取3中順序進行遍歷,分別是前序遍歷、中序遍歷和後序遍歷。 這三種方式是以訪問父節點的順序來進行命名的。 假設父節點是N,左節點是L,右節點是R,那麼對應的訪問遍歷順序如下: 前序遍歷    N->L->R 中序遍歷  

已知|後建立及三種方式

const int maxv= 10000+10; int n; int in_order[maxv],post_order[maxv],pre_order[maxv]; int lch[maxv],rch[maxv]; //左右子節點 int build1(int L1,

已知結果或後結果),還原建立

主函式 int main(int argc, char** argv){ int n, m; cin>>n; for(int i=0;i<n;i++){ cin>>m; v.push_back(m); } for(

3.1分別用遞迴非遞迴方式實現

題目 用遞迴和非遞迴方式,分別按照二叉樹先序、中序和後序列印所有的節點。 首先給出二叉樹節點結構定義: public class BinaryTreeNode { //二叉樹節點 private int data; private Bi

[LeetCode] Construct Binary Tree from Preorder and Inorder Traversal 由建立

Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree. 這道題要求用先序和中序遍

已知,輸出後

已知先序遍歷和中序遍歷,輸出後序遍歷 題目描述 對於一棵二叉樹,已知先序遍歷ACDEFHGB,中序遍歷DECAHFBG,求後序遍歷。 解題思路 首先條件給出了先序遍歷和中序遍歷,那麼我們利用這兩種遍歷特性得到一下資訊: 對於先序遍歷,第一個節點是根節點 對於中序遍歷,

根據序列求解後的演算法

問題模型:已知某二叉樹前序遍歷序列為1,2,3,4,5,6,中序遍歷為3,2,4,1,6,5,設計程式計算後序序列。 關於這個問題你可以通過前序遍歷和中序遍歷建立一顆樹,然後通過後序遍歷進行求解,當然還可以直接根據已知兩序列直接推理後序序列,本文將對這種分析進行介紹。 利用

【面試題】根據構造

class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { int len = vin.si

(1)建立二叉樹二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序中序和序遍歷的遞迴非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。 (4)求二叉樹的所有葉子及結點總數。

(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。(4)求二叉樹的所有葉子及結點總數。 include<stdio.h> #inclu

已知一個按序列輸入的字元序列,如abc,,de,g,,f,,,(其中逗號表示空節點)。請建立並按方式,最後求出葉子節點個數深度。

這是一個標準的模板題 記下了就完事了! Input   輸入一個長度小於50個字元的字串。 Output 輸出共有4行: 第1行輸出中序遍歷序列; 第2行輸出後序遍歷序列; 第3行輸出葉子節點個數; 第4行輸出二叉樹深度。 Sample Input abc,,

根據的前構建的c語言完整程式碼

//重建二叉樹:輸入某二叉樹的前序和中序遍歷,重建出該二叉樹 #include<stdio.h> #include<malloc.h> typedef struct binarytreenode { int value; struct