java实现完全二叉树

本文介绍如何使用Java构建完全二叉树,并详细阐述了二叉树类的属性和功能,包括成员变量、成员函数的设计。此外,文章讨论了完全二叉树的特点,如父子节点关系和节点的添加规则。最后,提供了实现先序遍历、中序遍历、后序遍历的代码。
摘要由CSDN通过智能技术生成

需求:

使用java构建完全二叉树,实现先序遍历、中序遍历、后序遍历。

分析:

1、分析二叉树类的属性和功能,即成员变量和成员函数

成员变量:

    存储所有节点值的数组和存储所有节点的集合。

    二叉树的节点都有值,可以将所有的值存到数组中,并且要以节点形式存在,存到集合中。

成员函数:

    创建二叉树(类似于File类,创建File对象功能定义在内部);获取根节点函数;先序遍历;中序遍历;后序遍历

内部类:

    节点类TreeNode

    二叉树本身是由很多节点构成的,每个节点有值和儿子节点,构造Node类作为二叉树类的内部类,方便处理。这就是说,如果类A中包含类B,就可以直接将B定义在A中,方便使用。

构造函数:

    传入二叉树各节点值组成的数组。

2、父子节点关系

    除了最后一个父节点,每个父节点都有两个儿子,最后一个父节点有左儿子,但是不一定有右儿子,当节点个数是奇数时,才有右儿子。

3、完全二叉树

    若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续

完全二叉树是一种特殊的二叉树,它的每个节点都有左子树和右子树,并且除了最后一层节点可以不满外,其它每层节点数都必须达到最大值,即第 $i$ 层节点数为 $2^{i-1}$ 个。下面是用Java实现完全二叉树的基本步骤: 1. 定义节点类 完全二叉树的节点需要保存值、左子节点、右子节点三个属性。可以定义如下节点类: ``` public class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; } } ``` 2. 构建完全二叉树 完全二叉树一般使用数组来存储,因为每个节点的位置都是固定的。假设当前要构建的完全二叉树的节点数为n,则它的深度为log2(n)+1。因此,可以定义一个长度为n的数组来存储完全二叉树的各个节点。对于第i个节点,它的左子节点在数组中的位置为2*i,右子节点在数组中的位置为2*i+1。 具体实现可以按照以下步骤: ``` public TreeNode buildCompleteBinaryTree(int[] nums) { if (nums == null || nums.length == 0) { return null; } // 定义一个节点数组来存储完全二叉树 TreeNode[] nodes = new TreeNode[nums.length]; for (int i = 0; i < nums.length; i++) { nodes[i] = new TreeNode(nums[i]); } // 构建完全二叉树 for (int i = 0; i < nums.length / 2; i++) { if (2 * i + 1 < nums.length) { nodes[i].left = nodes[2 * i + 1]; } if (2 * i + 2 < nums.length) { nodes[i].right = nodes[2 * i + 2]; } } return nodes; } ``` 3. 遍历完全二叉树 完全二叉树的遍历可以使用递归实现。下面给出前序遍历、中序遍历和后序遍历的代码实现: ``` // 前序遍历 public void preOrder(TreeNode root) { if (root != null) { System.out.print(root.val + " "); preOrder(root.left); preOrder(root.right); } } // 中序遍历 public void inOrder(TreeNode root) { if (root != null) { inOrder(root.left); System.out.print(root.val + " "); inOrder(root.right); } } // 后序遍历 public void postOrder(TreeNode root) { if (root != null) { postOrder(root.left); postOrder(root.right); System.out.print(root.val + " "); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值