package tree;
public class ConstructSpecialBinary {
/**
* Construct Special Binary Tree from given Inorder traversal
Given Inorder Traversal of a Special Binary Tree in which key of every node is greater
than keys in left and right children, construct the Binary Tree and return root.
Examples:
Input: inorder[] = {5, 10, 40, 30, 28}
Output: root of following tree
40
/ \
10 30
/ \
5 28
The idea used in Construction of Tree from given Inorder and Preorder traversals can be used here.
Let the given array is {1, 5, 10, 40, 30, 15, 28, 20}. The maximum element in given array must be root.
The elements on left side of the maximum element are in left subtree and elements on right side are in
right subtree.
40
/ \
{1,5,10} {30,15,28,20}
We recursively follow above step for left and right subtrees, and finally get the following tree.
40
/ \
10 30
/ \
5 28
/ / \
1 15 20
* @param args
*/
public static TreeNode construct(int[] inorder,int left,int right){
if(left>right) return null;
if(left==right) return new TreeNode(inorder[left]);
int i = getmax(inorder,left,right);
TreeNode root = new TreeNode(inorder[i]);
root.left = construct(inorder, left, i-1);
root.right = construct(inorder, i+1, right);
return root;
}
private static int getmax(int[] inorder, int left, int right) {
int i=left;
int k = left;
int max = inorder[left];
for(;i<=right;i++){
if(inorder[i]>max){
k = i;
break;
}
}
return k;
}
public static void printin(TreeNode root){
if(root==null) return;
printin(root.left);
System.out.print(root.value+" ");
printin(root.right);
}
public static void main(String[] args) {
int[] inorder = {1, 5, 10, 40, 30, 15, 28, 20};
TreeNode root = construct(inorder, 0, inorder.length-1);
printin(root);
}
}
Construct Special Binary Tree from given Inorder traversal
最新推荐文章于 2021-07-06 08:51:48 发布