二叉树的右视图

二叉树的右视图

1、题目

  • 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

  • 示例:

输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:

   1            <---
 /   \
2     3         <---
 \     \
  5     4       <---

2、代码

2.1、代码思路

  • 大体思路和二叉树的层序遍历差不多,只不过每次只需要当前层的队列中最后一个元素
    • 将根节点入队
    • 执行以下操作,直至队列为空
      • 将该层的节点的下一层节点依次放入队列中
      • 将该层的最后一个节点从队列中取出,放入待返回的集合中

2.2、树节点的定义

//二叉树节点的定义
class Node {
	public Integer data;
	public Node left;
	public Node right;

	public Node(Integer data) {
		this.data = data;
	}

	public String toString() {
		return data.toString();
	}
}

2.3、二叉树的右视图

//二叉树的定义
class BinaryTree {
	public Node root;

	public List<Node> rightSideView() {
		if (root == null) {
			System.out.println("二叉树为空~~~");
		}

		// 队列
		Queue<Node> queue = new LinkedList<Node>();
		// 根节点加入队列
		queue.add(root);

		// 待返回的集合
		List<Node> rightSideNodes = new ArrayList<Node>();

		// 循环至队列为空
		while (!queue.isEmpty()) {

			// 当前层的节点个数
			int curLevelCount = queue.size();

			Node curNode = null;

			// 遍历当前层的节点
			for (int i = 0; i < curLevelCount; i++) {
				// 依次取出当前层的节点
				curNode = queue.remove();
				// 如果其左节点不为空,加入队列中
				if (curNode.left != null) {
					queue.add(curNode.left);
				}
				// 如果其右节点不为空,加入队列中
				if (curNode.right != null) {
					queue.add(curNode.right);
				}
			}
			// 将当前层最后一个节点加入待返回的集合中
			rightSideNodes.add(curNode);
		}
		return rightSideNodes;
	}
}

2.4、测试代码

  • 代码
public static void main(String[] args) {

    Node node1 = new Node(1);
    Node node2 = new Node(2);
    Node node3 = new Node(3);
    Node node4 = new Node(4);
    Node node5 = new Node(5);

    // 构造二叉树
    node1.left = node2;
    node1.right = node3;
    node2.left = null;
    node2.right = node5;
    node3.left = null;
    node3.right = node4;

    BinaryTree binaryTree = new BinaryTree();
    binaryTree.root = node1;

    // 获取二叉树的右视图
    List<Node> rightSideView = binaryTree.rightSideView();
    System.out.println(rightSideView);

}
  • 程序运行结果
[1, 3, 4]

2.5、全部代码

public class RightSideView {
	public static void main(String[] args) {

		Node node1 = new Node(1);
		Node node2 = new Node(2);
		Node node3 = new Node(3);
		Node node4 = new Node(4);
		Node node5 = new Node(5);

		// 构造二叉树
		node1.left = node2;
		node1.right = node3;
		node2.left = null;
		node2.right = node5;
		node3.left = null;
		node3.right = node4;

		BinaryTree binaryTree = new BinaryTree();
		binaryTree.root = node1;

		// 获取二叉树的右视图
		List<Node> rightSideView = binaryTree.rightSideView();
		System.out.println(rightSideView);

	}
}

//二叉树的定义
class BinaryTree {
	public Node root;

	public List<Node> rightSideView() {
		if (root == null) {
			System.out.println("二叉树为空~~~");
		}

		// 队列
		Queue<Node> queue = new LinkedList<Node>();
		// 根节点加入队列
		queue.add(root);

		// 待返回的集合
		List<Node> rightSideNodes = new ArrayList<Node>();

		// 循环至队列为空
		while (!queue.isEmpty()) {

			// 当前层的节点个数
			int curLevelCount = queue.size();

			Node curNode = null;

			// 遍历当前层的节点
			for (int i = 0; i < curLevelCount; i++) {
				// 依次取出当前层的节点
				curNode = queue.remove();
				// 如果其左节点不为空,加入队列中
				if (curNode.left != null) {
					queue.add(curNode.left);
				}
				// 如果其右节点不为空,加入队列中
				if (curNode.right != null) {
					queue.add(curNode.right);
				}
			}
			// 将当前层最后一个节点加入待返回的集合中
			rightSideNodes.add(curNode);
		}
		return rightSideNodes;
	}
}

//二叉树节点的定义
class Node {
	public Integer data;
	public Node left;
	public Node right;

	public Node(Integer data) {
		this.data = data;
	}

	public String toString() {
		return data.toString();
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值