二叉树按层遍历打印

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

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

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代替。

 

 

 

 

 

 

在计算机科学中,当给定一个二叉树的中序遍历序列(In-order traversal)和后序遍历序列(Post-order traversal),我们可以利用这两个序列的信息重建整个二叉树。这是因为中序遍历可以得到节点值有序的左子树、根节点、右子树顺序,而后序遍历则是左子树、右子树、根节点的顺序。 以下是基本步骤: 1. **创建空堆栈**:用于存储后序遍历中的元素,因为后序遍历最后一个访问的是根节点。 2. **中序遍历序列**: - 遍历过程中,遇到节点值就压入堆栈,因为中序遍历左子树->根节点->右子树。 3. **后序遍历序列**: - 当后序遍历的第一个元素与当前堆栈顶元素匹配时,说明找到了根节点,将它弹出并作为新二叉树的根,同时记录它的左右子节点。 4. **构建二叉树**:继续从后序遍历中移除元素,直到遍历完,此时堆栈只剩下一个节点,它是右子节点;然后将其与前一个找到的根节点连接起来。 最后,我们需要按照层序遍历(Level Order Traversal)的规则打印二叉树:从上到下,同一从左到右。 以下是Python的一个示例代码片段,假设输入序列已经存储在`inorder`和`postorder`变量中: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(inorder, postorder): if inorder and postorder: root_val = postorder.pop() # 根据后序遍历找到根节点 root = TreeNode(root_val) index = inorder.index(root_val) # 找到根节点在中序遍历中的位置 root.left = buildTree(inorder[:index], postorder) # 递归处理左子树 root.right = buildTree(inorder[index+1:], postorder) # 递归处理右子树 return root # 示例 in_order = [4,2,5,1,3,6] post_order = [4,5,2,6,3,1] root = buildTree(in_order, post_order) # 现在你可以调用 `levelOrderTraversal(root)` 来获取层序遍历结果 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值