数据结构与算法(JAVA版)7_3:求二叉树的最大宽度(计算某一层存在的最大结点数)

首先来看一下层序遍历的代码

package com.inspire.chapter7;

import java.util.LinkedList;
import java.util.Queue;

public class Code03_LevelTraversalBT {

	public static class Node {
		public int value;
		public Node left;
		public Node right;

		public Node(int v) {
			value = v;
		}
	}

	// 层序遍历
	public static void level(Node head) {
		if (head == null) {
			return;
		}
		Queue<Node> queue = new LinkedList<>();
		queue.add(head);
		while (!queue.isEmpty()) {
			Node cur = queue.poll();
			System.out.print(cur.value + " ");
			if (cur.left != null) {
				queue.add(cur.left);
			}
			if (cur.right != null) {
				queue.add(cur.right);
			}
		}

	}

	public static void main(String[] args) {
		Node head = new Node(1);
		head.left = new Node(2);
		head.right = new Node(3);
		head.left.left = new Node(4);
		head.left.right = new Node(5);
		head.right.left = new Node(6);
		head.right.right = new Node(7);
		level(head);
	}

}

其实就是宽度优先遍历,用队列

package com.inspire.chapter7;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;

/*
 * 求二叉树的最大宽度(计算某一层存在的最大结点数)
 * 用到层序遍历的思想
 */
public class Code04_TreeMaxWidth {

	public static class Node {
		public int value;
		public Node left;
		public Node right;

		public Node(int v) {
			value = v;
		}
	}

	public static int MaxWidthUseMap(Node head) {
		if (head == null) {
			return 0;
		}
		// 用于层序遍历
		Queue<Node> queue = new LinkedList<>();
		queue.add(head);
		// 记录一个结点以及该结点所在层数
		Map<Node, Integer> map = new HashMap<>();
		map.put(head, 1);
		int curLevel = 1;// 记录当前所在层
		int curLevelNodes = 0;// 记录某一层的结点数
		int max = 0;// 记录某一层最大的结点数
		while (!queue.isEmpty()) {
			Node cur = queue.poll();
			int curNodeLevel = map.get(cur);// 获取弹出结点所在层数
			if (cur.left != null) {
				map.put(cur.left, curNodeLevel + 1);
				queue.add(cur.left);
			}
			if (cur.right != null) {
				map.put(cur.right, curNodeLevel + 1);
				queue.add(cur.right);
			}
			if (curNodeLevel == curLevel) {// 如果当前节点所在层数等于当前层数
				curLevelNodes++;
			} else {// 否则,这个节点就在下一层,就可以统计上一层所累加的结点数了
				max = Math.max(max, curLevelNodes);
				curLevel++;
				curLevelNodes = 1;// 切记:此时该节点已经进入下一层,因此将这个参数置为1
			}
		}
		max = Math.max(max, curLevelNodes);
		return max;
	}

	public static int maxWidthNoMap(Node head) {
		if (head == null) {
			return 0;
		}
		Queue<Node> queue = new LinkedList<>();
		queue.add(head);
		Node curEnd = head;// 当前层最右边的结点
		Node nextEnd = null;// 下一层最右边的结点:思想:当前层遍历的时候为下一层做准备
		int curLevelNodes = 0;// 当前层的结点数
		int max = 0;
		while (!queue.isEmpty()) {
			Node cur = queue.poll();
			if (cur.left != null) {
				queue.add(cur.left);
				nextEnd = cur.left;
			}
			if (cur.right != null) {
				queue.add(cur.right);
				nextEnd = cur.right;
			}
			curLevelNodes++;
			if (cur == curEnd) {// 如果当前结点走到了最右
				max = Math.max(max, curLevelNodes);
				curLevelNodes = 0;
				curEnd = nextEnd;
			}
		}
		return max;
	}

	public static void main(String[] args) {
		Node head = new Node(1);
		head.left = new Node(2);
		head.right = new Node(3);
		head.left.left = new Node(4);
		head.left.right = new Node(5);
		head.right.left = new Node(6);
		head.right.right = new Node(7);
		head.left.right.left = new Node(8);
		head.left.right.right = new Node(9);
		head.right.left.left = new Node(10);
		head.right.left.right = new Node(11);
		head.right.right.left = new Node(12);
		head.right.right.right = new Node(13);
		System.out.println(MaxWidthUseMap(head));
		System.out.println(maxWidthNoMap(head));
	}

}

你可能感兴趣的:(算法与数据结构,算法,二叉树,数据结构,队列,java)