二叉树按层遍历打印

二叉树按层进行遍历,例如:

             ①
         ②       ③
       ④   ⑤    ⑥     进行按层遍历的话打印就是:

1

2 3

4 5 6

思路:

      用一个current来表示当前指针,用nextLastRight来表示最右节点的指针,例如,current一开始指向1,而下一行的nextLastRight指针指向子节点的最右边,假如没有右子树,nextLastRight就指向左子树。

下面看看代码:

package com.lxj.binarytree;

import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.ArrayBlockingQueue;

public class Tree {
    
	private Tree left;
	private Tree right;
	private int value;
	
	public int getValue() {
		return this.value;
	}
	
	public void setValue(int value) {
		this.value = value;
	}
	
	public void setLeft(Tree left) {
		this.left = left;
	}

	public void setRight(Tree right) {
		this.right = right;
	}

	public Tree getLeft() {
		return this.left;
	}
	
	public Tree getRight() {
		return this.right;
	}

	public static void main(String []args) throws InterruptedException {
		Test test = new Test();
		Tree head = new Tree();
		test.buildTree(head);
//		System.out.println(head);
//		test.pre(head);
		//二叉树按层遍历
		test.layerForeach(head);
//		test.pre(head);
	}
	
}
/*二叉树宽度按层遍历
             ①
         ②       ③
       ④   ⑤    ⑥  0  
      0 0 0 0  0 0 
        1
		2
		4
		-1
		-1
		5
		-1
		-1
		3
		6
		-1
		-1
		-1
*/
class Test{
	  public void layerForeach(Tree head) throws InterruptedException {
		  ArrayBlockingQueue<Tree> queue = new ArrayBlockingQueue<>(20);
		  Tree curr = head;
		  Tree nextLast = head;
		  queue.put(head);
		   while(head != null) {
			   curr = head;
			   if(head.getLeft() != null) {
				   queue.put(head.getLeft());
			   }
			   if(head.getRight() != null) {
				   queue.put(head.getRight());
			   }
			   //如果当前节点等于最右节点则进行换行
			   int temp = queue.poll().getValue();
			   //假如是最右节点则进行换行
			   if(curr == nextLast) {
				  if(temp != 0) {
					  System.out.println(temp);
				  }
				   //找到最右节点
				   if(curr.getRight() != null) {
					   nextLast = curr.getRight();
				   }else {
					   nextLast = curr.getLeft();
				   }
			   }else {
				   if(temp != 0) {
				     System.out.print(temp + "  ");
				   }
			   }
			   //更新head值,但不出队列
			   head = queue.peek();
		   }
	  }
	  
    //构建二叉树,0代表为空
	public void buildTree(Tree head) {
		Scanner sc = new Scanner(System.in);
		int t;
		if(( t = sc.nextInt()) != -1) {
			head.setValue(t);
			head.setLeft(new Tree());
			head.setRight(new Tree());
			buildTree(head.getLeft()); 
			buildTree(head.getRight()); 
		}else {
			head = null;
		}
	}
	
	//二叉树的先序遍历
	public void pre(Tree head) {
		if(head != null) {
			System.out.println(head.getValue());
			pre(head.getLeft());
			pre(head.getRight()); 
		}
	}
}

我这里构建二叉树是以-1为结束标志的,所以无子节点用-1代替。

 

 

 

 

 

 

好的,以下是一个简单的关于数据结构二叉树的程序,包括输入二叉树,前序遍历二叉树,中序遍历二叉树,后序遍历二叉树,层次遍历二叉树等功能,并且有菜单供用户选择。 ```c #include <stdio.h> #include <stdlib.h> //定义二叉树结构体 typedef struct tree_node{ int data; struct tree_node *left; struct tree_node *right; }tree_node; //创建树节点 tree_node* create_node(int data){ tree_node *node = (tree_node*)malloc(sizeof(tree_node)); node->data = data; node->left = NULL; node->right = NULL; return node; } //插入节点到二叉树 tree_node* insert_node(tree_node *root, int data){ if(root == NULL){ root = create_node(data); }else if(data <= root->data){ root->left = insert_node(root->left, data); }else{ root->right = insert_node(root->right, data); } return root; } //前序遍历二叉树 void preorder_tree(tree_node *root){ if(root == NULL) return; printf("%d ", root->data); preorder_tree(root->left); preorder_tree(root->right); } //中序遍历二叉树 void inorder_tree(tree_node *root){ if(root == NULL) return; inorder_tree(root->left); printf("%d ", root->data); inorder_tree(root->right); } //后序遍历二叉树 void postorder_tree(tree_node *root){ if(root == NULL) return; postorder_tree(root->left); postorder_tree(root->right); printf("%d ", root->data); } //获取树的高度 int get_height(tree_node *root){ if(root == NULL) return -1; int left_height = get_height(root->left); int right_height = get_height(root->right); if(left_height > right_height) return left_height + 1; else return right_height + 1; } //按层遍历二叉树 void level_order_tree(tree_node *root){ if(root == NULL) return; int height = get_height(root); int i; for(i = 0; i <= height; i++){ print_level(root, i); } } //按层打印二叉树 void print_level(tree_node *root, int level){ if(root == NULL) return; if(level == 0){ printf("%d ", root->data); }else{ print_level(root->left, level - 1); print_level(root->right, level - 1); } } int main(){ tree_node *root = NULL; int choice, data; do{ printf("\n1. 插入节点"); printf("\n2. 前序遍历"); printf("\n3. 中序遍历"); printf("\n4. 后序遍历"); printf("\n5. 层次遍历"); printf("\n0. 退出"); printf("\n请输入你的选择:"); scanf("%d", &choice); switch(choice){ case 0: break; case 1: printf("\n请输入节点值:"); scanf("%d", &data); root = insert_node(root, data); break; case 2: printf("\n前序遍历结果:"); preorder_tree(root); break; case 3: printf("\n中序遍历结果:"); inorder_tree(root); break; case 4: printf("\n后序遍历结果:"); postorder_tree(root); break; case 5: printf("\n层次遍历结果:"); level_order_tree(root); break; default: printf("\n请输入正确的选择!"); break; } }while(choice != 0); return 0; } ``` 在程序中,我们定义了一个二叉树节点的结构体,并定义了一些函数来实现不同的功能。在主函数中,我们使用了一个 do-while 循环来让用户选择操作,用户可以选择插入节点、前序遍历、中序遍历、后序遍历、层次遍历或退出程序。根据用户的选择,程序会调用相应的函数来实现相应的功能。 以上是一个简单的关于数据结构二叉树的程序,仅供参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值