1. 程式人生 > >二叉樹 知道其他兩種遍歷方式求另一種

二叉樹 知道其他兩種遍歷方式求另一種

已知先序和中序

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
    int prel=preorder.size();
    int in=inorder.size();
    return suan(preorder,0,prel-1,inorder,0,in-1);
}
TreeNode* suan(vector<int>& preorder,int ps,int pe, vector<int>& inorder,int is,int ie)
{
    if(ps==pe)
        return new TreeNode(preorder[ps]);
    if(is>ie||ps>pe)
        return NULL;

    TreeNode* root = new TreeNode(preorder[ps]);
    int i=is;
    while(i<=ie)
    {
        if(inorder[i]==preorder[ps])

            break;
        i++;
    }
    int len=i-is;
    root->left=suan(preorder,ps+1,ps+len,inorder,is,is-1+len);
    root->right=suan(preorder,ps+1+len,pe,inorder,is+len+1,ie);
    return root;
}

};

已知後序和中序
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
   
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder)
{
    int io=inorder.size();
    int po=postorder.size();
    return suan(inorder,0,io-1,postorder,0,po-1);
}
TreeNode* suan(vector<int>& inorder,int is,int ie, vector<int>& postorder,int ps,int pe)
{
    if(is==ie)
        return new TreeNode(inorder[is]);
   else  if(is>ie)
        return NULL;

    TreeNode* root = new TreeNode(postorder[pe]);
    int i=is;
    while(i<=ie)
    {
        if(inorder[i]==postorder[pe])

            break;
        i++;
    }
    int len=i-is;
    root->left=suan(inorder,is,is+len-1,postorder,ps,ps-1+len);
    root->right=suan(inorder,is+1+len,ie,postorder,ps+len,pe-1);
    return root;
}

};


相關推薦

知道其他方式

已知先序和中序 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *

利用棧結構實現的非遞迴深度、葉子節點數、個結點的最近公共祖先及結點的最大距離

原文地址:http://blog.csdn.net/forbes_zhong/article/details/51227747 利用棧實現二叉樹的非遞迴遍歷,並求二叉樹的深度、葉子節點數、兩個節點的最近公共祖先以及二叉樹結點的最大距離,部分參考《劍指offer》這本書

資料結構-基礎題目小結(節點數目等等)

給定一個前序序列陣列構造一個二叉樹 思路:首先序列中要有給定的非法值,也就是二叉樹中對應的空節點;對於構造一個二叉樹可以使用遞迴的思想:先構造當前節點,再構造左子樹,再右子樹,直到遇到非法值時

相關演算法——建立、深度和廣度

二叉樹相關的演算法,遍歷使用了遞迴和迭代兩種演算法,可作為結果對比。 理解起來不難,直接上程式碼,有空再補下注釋說明原理。 package com.junyang.algodemo.Tree; import java.util.LinkedList; im

的建立與各種方式

#include<cstdlib> #include<string> #include<iostream> #include<cmath> #include<cstring> #include<algorit

已知 序列 第三序列

已知 前序和中序遍歷 求後序遍歷序列 struct node *creat(char *a, char *b, int n) { struct node *ptr; char

數據結構與算法第10周作業——的創建和算法

技術分享 truct order traverse eof 結構 後序遍歷 lib void 一、二叉樹的創建算法(遞歸方式) 二、二叉樹的先序、中序和後序遍歷算法 #include<stdio.h>#include<stdlib.h>typedef

數據結構-第10周作業(的創建和算法)

樹的創建 創建 -1 數據結構 二叉 分享 com jpg 遍歷算法 數據結構-第10周作業(二叉樹的創建和遍歷算法)

七:重建(依據先序(或者後序)和中序重建

off 相同 tree int roo 節點 先序 throw -a 對於一顆二叉樹。能夠依據先序遍歷(或者後序遍歷)和中序遍歷(樹中不含反復的數字)又一次還原出二叉樹。 解析: 1. 先序遍歷序列的第一個元素必然是根節點,能夠由此獲取二叉樹的根節點。 2. 依

的創建、、判斷子

stat 技術 get sys 找到 btree gif public str 1、二叉樹節點類 public class TreeNode { int val = 0; TreeNode left = null; TreeNode right

的創建、、查找、刪除

遞歸 瀏覽器 nod 刪除 reac 二叉樹的遍歷 初始化 後序遍歷 lba 一、二叉樹的基本概念 一棵非空的二叉樹由根結點及左、右子樹這三個基本部分組成。如下圖: 數字8為根節點,1、4、7、13為葉子節點,8的左邊為左子樹,數值都比根節點8小,右邊為右子樹,數值

的非遞歸

std 是否 分配 printf 棧空間 str nco 結束 oid 全部代碼 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <assert.h> 4

記錄一下關於的非遞歸

printf order type typedef print 課本 pos else if post 利用棧的非遞歸先序遍歷二叉樹: 額,這個是我自己寫的,可能算法有點啰嗦…… /********** 【題目】試利用棧及其基本操作寫出二叉樹T的非遞歸 的先序遍歷算法。

103 Binary Tree Zigzag Level Order Traversal 的鋸齒形層次

bsp size light emp == push 鋸齒形 .com null 給定一個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。例如:給定二叉樹 [3,9,20,null,null,15,7],

的創建和

二叉樹 遍歷 #include<stdio.h> #include<stdlib.h> typedef struct Tree{ char data; struct Tree *lchild; struct Tree *rchild; }BTree; v

leetcode 103. 的鋸齒形層次

push_back clas 層次遍歷 返回 urn null leetcode div order 給定一個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。 例如:給定二叉樹 [3,9,20,null,nul

UVa 122 Trees on the level(鏈式的建立和層次

構建 void target .net color 鏈接 struct failed div 題目鏈接: https://cn.vjudge.net/problem/UVA-122 1 /* 2 問題 3 給出每個節點的權值和路線,輸出該二叉樹的層次遍歷序列。

的常見建立和

#include <stdio.h> #include <stdlib.h>> const int MAX=20; typedef struct Node { char data; struct Node*lchild; struct Node*rchild

建立、先序、中序、後序深度

一、概念:         二叉樹遍歷:按指定的某條搜尋路徑訪問樹中每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。         根節點N,按照先遍歷左子樹L再遍歷右子樹R的原則,常見的有三種:先

的非遞迴和層次

資料結構 struct node{     int val;     node *lchild,*rchild; }; 先序非遞迴遍歷  1)  訪問結點p,並將結點P入棧;  2)  判