根据给定的数组或链表构建完全二叉树(Java)
2018-02-25 11:30
330 查看
import java.util.*;
/**
* 根据二叉树的性质(将一个完全二叉树按照从上到下,从左到右进行编号,其编号为i的节点,
* 如果满足2*i<=n,则说明编号为i的节点有左孩子,否则没有,如果满足2*i+1<=n,
* 则说明编号为i的节点有右孩子,否则没有)可知
2*i<=n
2*i+1<=n
该性质是对树的编号(1~n)成立的,而数组的下标是从0到n-1,将对应下标都减1可知,对于数组0~n-1来说,
2*i-1<=n-1
2*i<=n-1是成立的。
*/
import java.util.*;
public class 根据数组构建完全二叉树 {
private static class BinaryTreeNode {
private int data;
private BinaryTreeNode left;
private BinaryTreeNode right;
public BinaryTreeNode(int e) {
this.data = e;
}
public BinaryTreeNode() {
// TODO Auto-generated constructor stub
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int[] arr = new int[] {1,2,3,4,5,6,7,8,9,10};
BinaryTreeNode root = createTree(arr);
System.out.println("-leverTraverse----preOrder-----inOrder");
levelTraverse(root);
System.out.println();
preOrder(root);
System.out.println();
inOrder(root);
}
// 根据数组创建完全二叉树
private static BinaryTreeNode createTree(int[] arr) {
if(arr.length==1)
return new BinaryTreeNode(arr[0]);
List<BinaryTreeNode> nodeList = new ArrayList<>();
for(int i=0;i<arr.length;i++)
nodeList.add(new BinaryTreeNode(arr[i]));
for(int i=1;i<=arr.length/2;i++) {
if(2*i-1<=arr.length-1)
nodeList.get(i-1).left = nodeList.get(2*i-1);
if(2*i<=arr.length-1)
nodeList.get(i-1).right = nodeList.get(2*i);
}
return nodeList.get(0);
}
static void preOrder(BinaryTreeNode root) {
if (root == null)
return;
else {
System.out.print(root.data + " ");
preOrder(root.left);
preOrder(root.right);
}
}
static void inOrder(BinaryTreeNode root) {
if (root == null)
return;
else {
inOrder(root.left);
System.out.print(root.data + " ");
inOrder(root.right);
}
}
private static void levelTraverse(BinaryTreeNode root) {
BinaryTreeNode temp;
Queue<BinaryTreeNode> queue = new LinkedList<>();
if (root == null)
return;
queue.offer(root);
while ((temp = queue.poll())!=null) {
System.out.print(temp.data + " ");
if (temp.left != null)
queue.offer(temp.left);
if (temp.left != null)
queue.offer(temp.right);
}
queue.clear();
}
}
public class 根据给定链表构建完全二叉树 {
private static class BinaryTreeNode {
private int data;
private BinaryTreeNode left;
private BinaryTreeNode right;
public BinaryTreeNode(int e) {
this.data = e;
}
public BinaryTreeNode() {
// TODO Auto-generated constructor stub
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
List<BinaryTreeNode> list = new ArrayList<>();
for (int i = 1; i <= 8; i++) {
list.add(new BinaryTreeNode(i));
}
BinaryTreeNode root = createTree(list);
System.out.println("leverTraverse----preOrder-----inOrder----postOrder");
levelTraverse(root);
System.out.println();
preOrder(root);
System.out.println();
inOrder(root);
System.out.println();
postOrder(root);
}
priva
4000
te static BinaryTreeNode createTree(List<BinaryTreeNode> list) {
if (list.size() == 1)
return list.get(0);
for (int i = 1; i <= list.size() / 2; i++) {
if (2 * i - 1 <= list.size() - 1)
list.get(i - 1).left = list.get(2 * i - 1);
if (2 * i <= list.size() - 1)
list.get(i - 1).right = list.get(2 * i);
}
return list.get(0);
}
static void preOrder(BinaryTreeNode root) {
if (root == null)
return;
else {
System.out.print(root.data + " ");
preOrder(root.left);
preOrder(root.right);
}
}
static void inOrder(BinaryTreeNode root) {
if (root == null)
return;
else {
inOrder(root.left);
System.out.print(root.data + " ");
inOrder(root.right);
}
}
static void postOrder(BinaryTreeNode root) {
if (root == null)
return;
else {
postOrder(root.left);
postOrder(root.right);
System.out.print(root.data + " ");
}
}
private static void levelTraverse(BinaryTreeNode root) {
BinaryTreeNode temp;
Queue<BinaryTreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty())
{
temp = queue.poll();
System.out.print(temp.data+" ");
if(temp.left != null)
{
queue.offer(temp.left);
}
if(temp.right != null)
{
queue.offer(temp.right);
}
}
}
}
/**
* 根据二叉树的性质(将一个完全二叉树按照从上到下,从左到右进行编号,其编号为i的节点,
* 如果满足2*i<=n,则说明编号为i的节点有左孩子,否则没有,如果满足2*i+1<=n,
* 则说明编号为i的节点有右孩子,否则没有)可知
2*i<=n
2*i+1<=n
该性质是对树的编号(1~n)成立的,而数组的下标是从0到n-1,将对应下标都减1可知,对于数组0~n-1来说,
2*i-1<=n-1
2*i<=n-1是成立的。
*/
import java.util.*;
public class 根据数组构建完全二叉树 {
private static class BinaryTreeNode {
private int data;
private BinaryTreeNode left;
private BinaryTreeNode right;
public BinaryTreeNode(int e) {
this.data = e;
}
public BinaryTreeNode() {
// TODO Auto-generated constructor stub
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int[] arr = new int[] {1,2,3,4,5,6,7,8,9,10};
BinaryTreeNode root = createTree(arr);
System.out.println("-leverTraverse----preOrder-----inOrder");
levelTraverse(root);
System.out.println();
preOrder(root);
System.out.println();
inOrder(root);
}
// 根据数组创建完全二叉树
private static BinaryTreeNode createTree(int[] arr) {
if(arr.length==1)
return new BinaryTreeNode(arr[0]);
List<BinaryTreeNode> nodeList = new ArrayList<>();
for(int i=0;i<arr.length;i++)
nodeList.add(new BinaryTreeNode(arr[i]));
for(int i=1;i<=arr.length/2;i++) {
if(2*i-1<=arr.length-1)
nodeList.get(i-1).left = nodeList.get(2*i-1);
if(2*i<=arr.length-1)
nodeList.get(i-1).right = nodeList.get(2*i);
}
return nodeList.get(0);
}
static void preOrder(BinaryTreeNode root) {
if (root == null)
return;
else {
System.out.print(root.data + " ");
preOrder(root.left);
preOrder(root.right);
}
}
static void inOrder(BinaryTreeNode root) {
if (root == null)
return;
else {
inOrder(root.left);
System.out.print(root.data + " ");
inOrder(root.right);
}
}
private static void levelTraverse(BinaryTreeNode root) {
BinaryTreeNode temp;
Queue<BinaryTreeNode> queue = new LinkedList<>();
if (root == null)
return;
queue.offer(root);
while ((temp = queue.poll())!=null) {
System.out.print(temp.data + " ");
if (temp.left != null)
queue.offer(temp.left);
if (temp.left != null)
queue.offer(temp.right);
}
queue.clear();
}
}
public class 根据给定链表构建完全二叉树 {
private static class BinaryTreeNode {
private int data;
private BinaryTreeNode left;
private BinaryTreeNode right;
public BinaryTreeNode(int e) {
this.data = e;
}
public BinaryTreeNode() {
// TODO Auto-generated constructor stub
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
List<BinaryTreeNode> list = new ArrayList<>();
for (int i = 1; i <= 8; i++) {
list.add(new BinaryTreeNode(i));
}
BinaryTreeNode root = createTree(list);
System.out.println("leverTraverse----preOrder-----inOrder----postOrder");
levelTraverse(root);
System.out.println();
preOrder(root);
System.out.println();
inOrder(root);
System.out.println();
postOrder(root);
}
priva
4000
te static BinaryTreeNode createTree(List<BinaryTreeNode> list) {
if (list.size() == 1)
return list.get(0);
for (int i = 1; i <= list.size() / 2; i++) {
if (2 * i - 1 <= list.size() - 1)
list.get(i - 1).left = list.get(2 * i - 1);
if (2 * i <= list.size() - 1)
list.get(i - 1).right = list.get(2 * i);
}
return list.get(0);
}
static void preOrder(BinaryTreeNode root) {
if (root == null)
return;
else {
System.out.print(root.data + " ");
preOrder(root.left);
preOrder(root.right);
}
}
static void inOrder(BinaryTreeNode root) {
if (root == null)
return;
else {
inOrder(root.left);
System.out.print(root.data + " ");
inOrder(root.right);
}
}
static void postOrder(BinaryTreeNode root) {
if (root == null)
return;
else {
postOrder(root.left);
postOrder(root.right);
System.out.print(root.data + " ");
}
}
private static void levelTraverse(BinaryTreeNode root) {
BinaryTreeNode temp;
Queue<BinaryTreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty())
{
temp = queue.poll();
System.out.print(temp.data+" ");
if(temp.left != null)
{
queue.offer(temp.left);
}
if(temp.right != null)
{
queue.offer(temp.right);
}
}
}
}
相关文章推荐
- JavaScript根据数组构建链表
- [Java]给定一个递增有序数组,要求构建一棵具有最小高度的二叉查找树
- (树)根据排序数组或者排序链表重新构建BST树
- leetcode-java.T016_threeSumClosest---给定包含n个整数数组S,找到S中的三个整数,从而使之和最接近给定的数,返回三个整数的总和.
- java链表及数组的区别
- 【Java】有个排序后的字符串数组,其中散布着一些空字符串,编写一个方法,找出给定字符串的位置
- 剑指offer--(15)构建乘积数组--Java描述
- 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法
- Java集合,HashMap底层实现和原理(1.7数组+链表与1.8+的数组+链表+红黑树)
- 【Java】给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树
- [JAVA]给定一个整形数组,求其和、平均数、最大值及最小值、打印数组中的数据
- (旋转数组问题)给定一个整数类型的循环有序数组,求循环数组的特定值,使用二分查找法(JAVA实现)
- 构建乘积数组(Java实现)
- 程序员面试金典——解题总结: 9.18高难度题 18.8给定一个字符串s和一个包含较短字符串的数组T,设计一个方法,根据T中的每一个较短字符串,对s进行搜索
- 自行实现Map底层结构(数组+链表) --Java版
- leetcode-java.T015_3Sum---给定一个n个元素的数组,是否存在a,b,c三个元素,使用得a+b+c=0,找出所有符合这个条件的三元组
- 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法
- 链表逆序(递归&非递归)/倒序输出链表值/用一个递增序列构建平衡二叉搜索树/用递归的方法判断数组是不是升(降)序排列
- Java基础入门笔记-数组链表
- java实现单链表(增加节点,删除节点,根据下标获取节点,获取链表大小,链表逆序)