2011-01-01 35 views
6

Chúng ta có thể chứng minh rằng người ta có thể xây dựng một cây rõ ràng một cách rõ ràng từ các cây ngang hàng và trật tự cấp bậc của nó?Cây nhị phân từ các trình duyệt ngang hàng và trật tự cấp độ?

Tôi đang nghĩ đến bằng chứng bằng cảm ứng về số lượng các cấp.

Trường hợp cơ sở: cây có 1 hoặc 2 cấp. Những trường hợp này rõ ràng.

Giả sử rằng điều này giữ cho cây có mức l. Đó là: người ta có thể xây dựng một cây nhị phân một cách rõ ràng với các mức l từ các giao điểm trật tự cấp bậc và cấp bậc của nó.

Trường hợp quy nạp: chứng minh rằng điều này giữ cho cây có mức l + 1. Không rõ cách tiến hành trong trường hợp này. Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

Huh ... chỉ tò mò, là bài tập về nhà này? :) – Mehrdad

+0

Xin lỗi, đã phải đề cập đến nó trước đây. Không, nó không phải là một bài tập về nhà. Tôi đang cố gắng giải quyết http://stackoverflow.com/questions/4539698/finding-a-preorder-of-some-digits-with-their-levels-in-bst này và tôi chắc chắn, nó có thể được giải quyết nếu chúng tôi có bằng chứng cho việc này. –

Trả lời

5

Không chắc về bằng chứng, nhưng alg để làm như vậy sẽ là dọc theo dòng,

f(inorder, levelorder): 
     if length(levelorder) == 0: 
      return None 
     root = levelorder[0]#set root to first element in levelorder 
     subIn1, subIn2 = partition(inorder, levelorder[0]) #partition inorder based on root 
     subLevel1 = extract(levelOrder, subIn1)#remove elements in level order not in subIn1 
     subLevel2 = extract(levelOrder, subIn2)#remove elements in level order not in subIn2 
     root->left = f(subIn1, subLevel1) 
     root->right = f(subIn2, subLevel2) 
     return root 

Để chứng minh điều đó bạn sẽ phải chứng minh rằng dãy bên trái của một nút gốc trong một traversal inorder là một inorder traversal của subtree trái, và sau đó giống nhau cho bên phải. Đúng, nhưng tẻ nhạt để chứng minh.

Bạn cũng cần phải chứng minh rằng cấp độ được duy trì cho các mục phụ. Cũng đúng, nhưng tẻ nhạt để chứng minh.

Ồ vâng, bạn có thể phải chứng minh rằng phần tử đầu tiên trong quá trình truyền tải thứ tự cấp là gốc của cây, nhưng phải đến từ định nghĩa.

+0

Bạn có thể giải thích chức năng 'trích xuất' làm gì không? – SexyBeast

+0

Hàm trích xuất cần trả về giao điểm của cấp độ Order và subIn, duy trì thứ tự trong levelOrder. –

5

tôi đã đưa ra hướng dẫn này trên blog của tôi a) - inorder Traversal -POSTORDER Traversal

HOẶC

b) -INORDER Traversal -PREORDER Traversal

Chúng tôi thường nhận được câu hỏi như: -

Tạo cây Binery từ cây sau Traversals

1)

Inorder: E A C K F H D B G 
Preorder: F A E K C D H G B 

ĐÂY quan trọng nhất nghĩ đến LUÔN nhớ là: -

Trong preorderFIRST phần tử là ROOT của cây

Trong POSTorderLAST phần tử là ROOT của cây

Tôi hy vọng bạn đã nhận nó: P

i.e xem xét 1) Câu hỏi

1) Inorder: EACKFHDBG Preorder: FAEKCDHGB

F là gốc

EACK sẽ đi đến TREE SUB LEFT của Root

HDBG sẽ đi đến QUYỀN TỪ PHẢI của Gốc

Step 1) 

Bây giờ như chúng ta biết cái nào là gốc Vậy ...

     F 
       /\ 
     (E A C K)  (H D B G) 


Step 2) 

Bây giờ CHO CÂY SUB LEFT chúng tôi có EACK từ Inorder và chữ cùng AEKC từ Preorder

tức

Inorder E A C K 
Preorder A E K C 

hiện đã tìm thấy A làm Gốc một lần nữa vì vậy bây giờ cây là

     F 
       / \ 
        A  (H D B G) 
       /\ 
       E (C K) 


Step 3) 

Bây giờ chữ là

Inorder C K 
Preorder K C 

Bây giờ cây là

      F 
         / \ 
         A  (H D B G) 
        /\ 
        E K 
         /
         C 

thủ tục tương tự có thể được thực hiện trên cây Sub bên phải của gốc F

Đối Postorder chúng ta phải tìm gốc như phần tử cuối cùng trong quá trình truyền tải ....

Phiên bản đầy màu sắc hoặc này có thể được nhìn thấy ở đây http://bloggerplugnplay.blogspot.in/2012/11/construction-of-binary-tree-from.html: P

1

Tôi nghĩ rằng mã dưới đây nên làm việc -

/* 
//construct a bst using inorder & levelorder traversals. 
//inorder - 5, 10, 20, 50, 51, 55, 60, 65, 70, 80 
//levelorder - 50, 10, 60, 5, 20, 55, 70, 51, 65, 80 
     50 
    / \ 
    10  60 
/\  /\ 
    5 20 55 70 
      / /\ 
      51  65 80 
*/ 
struct node *construct_bst3(int inorder[], int levelorder[], int in_start, int in_end) 
{ 
    static int levelindex = 0; 
    struct node *nnode = create_node(levelorder[levelindex++]); 

    if (in_start == in_end) 
     return nnode; 

    //else find the index of this node in inorder array. left of it is left subtree, right of this index is right. 
    int in_index = search_arr(inorder, in_start, in_end, nnode->data); 

    //using in_index from inorder array, constructing left & right subtrees. 
    nnode->left = construct_bst3(inorder, levelorder, in_start, in_index-1); 
    nnode->right = construct_bst3(inorder, levelorder, in_index+1, in_end); 

    return nnode; 
} 
1

Mã này đang làm việc tốt mà không có bất kỳ faults.Sorry runtime cho việc sử dụng cách tiếp cận bruteforce. Mã cho printPretty() có sẵn tại
http://leetcode.com/2010/09/how-to-pretty-print-binary-tree.html

#include <fstream> 
#include <iostream> 
#include <deque> 
#include <iomanip> 
#include <sstream> 
#include <string> 

#include <math.h> 
#include <string.h> 
using namespace std; 

struct BinaryTree { 

    BinaryTree *left, *right; 
    char data; 
    BinaryTree(int val) : left(NULL), right(NULL), data(val) { } 
    ~BinaryTree(){ this->left = NULL; this->right = NULL ; } 

}; 
BinaryTree *createNode(char d) 
{ 
    return new BinaryTree(d); 
} 
#define MAX  256 
int indexOf[MAX]; 

void inorderIndex(char *IN,int n) 
{ 
    int i=0; 
    for (i = 0; i < n; i++) 
    { 
     indexOf[ (int)IN[i] ] = i; 
    } 
    return; 
} 

int searchIndex(char arr[], int strt, int end, char value) 
{ 
    int i; 
    for(i = strt; i <= end; i++) 
     if(arr[i] == value) 
      return i; 
    return -1; 
} 

BinaryTree *INLEVEL(char *in,char *level,int in_st,int in_end,int lev_st,int lev_end) 
{ 

    int idx=-1,i,left_lev_idx=-1,right_lev_idx=-1; 
    if(level[lev_st] == '\0') 
     return NULL; 

    idx = searchIndex(in,in_st,in_end,level[lev_st]); 
    if(idx == -1) 
     return NULL; 

    BinaryTree*root=createNode(level[lev_st]); 
// root->data = level[st]; 
    root->left = root->right = NULL; 

    for (i = lev_st+1; i <= lev_end ; i++) 
    { 
     if ((indexOf[ (int) level[i] ] > idx) && (indexOf[ (int) level[i] ] <= in_end)) 
      if(right_lev_idx == -1) 
       right_lev_idx = i; 

     if ((indexOf[ (int) level[i] ] < idx) && (indexOf[ (int) level[i] ] >= in_st)) 
      if(left_lev_idx == -1) 
       left_lev_idx = i; 

    } 
    if(left_lev_idx != -1) 
     root->left = INLEVEL(in,level,in_st,idx-1,left_lev_idx,lev_end); 

    if(right_lev_idx != -1) 
     root->right = INLEVEL(in,level,idx+1,in_end,right_lev_idx,lev_end); 

    return root; 
} 

int main() 
{ 
    char IN[100] ="DBFEAGCLJHK" 
    ,LEVEL[100]="ABCDEGHFJKL"; 
    BinaryTree *root =(BinaryTree *) NULL; 
    inorderIndex(IN,strlen(IN)); 
    root=INLEVEL(IN,LEVEL,0,strlen(IN)-1,0,strlen(IN)-1); 
//  printPretty(root, 2, 0, cout);  


    return 0; 
} 
0
static tree MakeTreeFromInorderAndLevelOrder(int[] inorder,int[] lorder,int s,int n,int cnt1) { 
    if(s>n || s>=inorder.length || n>=inorder.length || cnt1>=inorder.length) { 
     return null; 
    } 
    int mIndex = Search(lorder[cnt1],inorder,s,n); 
    tree t = new tree(lorder[cnt1]); 

    cnt1 = 2*cnt1 + 1; 
    t.left = MakeTreeFromInorderAndLevelOrder(inorder,lorder,s,mIndex-1,cnt1); 
    //Boundary case 
    if(cnt1<inorder.length && t.left==null) { 
     t.right = MakeTreeFromInorderAndLevelOrder(inorder,lorder,mIndex+1,n,cnt1); 
    } 
    else { 
    cnt1 -=1; 
    cnt1 /=2; 
    cnt1 = 2*cnt1 + 2; 
    t.right = MakeTreeFromInorderAndLevelOrder(inorder,lorder,mIndex+1,n,cnt1); 
    //Boundary case 
    if(t.right ==null && cnt1<inorder.length) { 
     t.left = MakeTreeFromInorderAndLevelOrder(inorder,lorder,s,mIndex-1,cnt1); 
    } 
    } 
    return t; 
} 
+0

Điều này hoạt động tốt –

0

Giải pháp Java:

import java.util.HashMap; 
import java.util.Iterator; 
import java.util.SortedSet; 
import java.util.TreeSet; 

public class InorderLevelorder { 

private static int[] levelArray; 

public static void main(String[] args) { 

    //in order traversal of binary tree 
    int[] in = {4,10,3,1,7,11,8,2}; 

    //level order traversal of binary tree 
    int[] lev = {7,10,2,4,3,8,1,11}; 

    //Builds a Binary Tree and returns the root node 
    buildTree(in, lev); 
} 

private static BinaryTreeNode buildTree(int[] in, int[] lev){ 

    //Hash the values of both the arrays for O(1) time search 
    HashMap<Integer, Integer> inMap = new HashMap<Integer, Integer>(); 
    HashMap<Integer, Integer> levMap = new HashMap<Integer, Integer>(); 
    levelArray = lev; 
    for(int i=0;i<in.length;i++) 
     inMap.put(in[i], i); 
    for(int j=0;j<lev.length;j++) 
     levMap.put(lev[j], j); 
    return buildTree(in, lev, 0, in.length - 1, inMap, levMap); 
} 

//recursive method that constructs the binary tree 
private static BinaryTreeNode buildTree(int[] in, int[] lev, int inStart, int inEnd, HashMap<Integer, Integer> inMap, HashMap<Integer, Integer> levMap){ 

    if(inStart > inEnd) 
     return null; 

    int nodeVal = lev[0]; 
    BinaryTreeNode node = new BinaryTreeNode(); 
    node.setData(nodeVal); 

    if(inStart == inEnd) 
     return node; 

    int inIndex = inMap.get(nodeVal); 
    int[] leftSubTree = subArray(in, levelArray, inStart, inIndex-1, inMap, levMap); 
    int[] rightSubTree = subArray(in, levelArray, inIndex+1, inEnd, inMap, levMap); 

    node.setLeftNode(buildTree(in, leftSubTree, inStart, inIndex-1, inMap, levMap)); 
    node.setRightNode(buildTree(in, rightSubTree, inIndex+1, inEnd, inMap, levMap)); 

    return node; 
} 

private static int[] subArray(int[] in, int[] lev, int inStart, int inEnd, HashMap<Integer, Integer> inMap, HashMap<Integer, Integer> levMap){ 

    int[] newSubArray = new int[inEnd - inStart + 1]; 
    SortedSet<Integer> set = new TreeSet<Integer>(); 
    for(int i=inStart;i<=inEnd;i++){ 
     int levIndex = levMap.get(in[i]); 
     set.add(levIndex); 
    } 
    int j=0; 
    Iterator<Integer> iter = set.iterator(); 
    while(iter.hasNext()){ 
     int levIndex = iter.next(); 
     int levValue = lev[levIndex]; 
     newSubArray[j] = levValue; 
     j++; 
    } 

    return newSubArray; 
} 
} 

class BinaryTreeNode { 

private int data; 
private BinaryTreeNode leftNode; 
private BinaryTreeNode rightNode; 

public int getData() { 
    return data; 
} 
public void setData(int data) { 
    this.data = data; 
} 
public BinaryTreeNode getLeftNode() { 
    return leftNode; 
} 
public void setLeftNode(BinaryTreeNode leftNode) { 
    this.leftNode = leftNode; 
} 
public BinaryTreeNode getRightNode() { 
    return rightNode; 
} 
public void setRightNode(BinaryTreeNode rightNode) { 
    this.rightNode = rightNode; 
} 

} 
Các vấn đề liên quan