java二叉树类_Java数据结构之二叉树(Binary Tree)

二叉树(Binary Tree) 是树类应用最广泛的一种数据结构,拉勾IT课小编为大家分解

, 是非线性数据结构。顾名思义, 二叉树的每个节点最多只能包含两个子节点, 一个节点可以包含0-2个子节点, 如果是两个子节点, 也就是通常我们说的左节点和右节点, 通常子树被称作“左子树” 和“右子树”

二叉树的应用很多, 也是项目中应用最多的数据结构: 例如Map、 Set、 JVM的堆内存的逻辑存储结构是完全二叉树等。

除了二叉树, 也有多叉树等, 当然子节点越多, 复杂度越高, 但是其树的高度比较低, 所以拥有较高的查找性能, 常用在数据库索引和文件系统。

比较常见的一些树名称的种类如下:

1.完全二叉树

完全二叉树是二叉树的一个分类, 它的特点是每个节点的孩子节点的数量可以是0-2 个, 除此之外,它要求每层节点添加, 必须是从左到右, 不允许跳着添加。

2.满二叉树 (Full Binary tree)

满二叉树它的特点是每个节点的孩子节点要么没有, 要么就是两个, 不允许出现单个孩子的情况。

3.二叉搜索树 (Ordered Binary Tree )

也称二叉排序树, 这个是我们接触的最多的一种结构, 它要求节点的左子树小于该节点本身, 右子树大于该节点,每个节点都符合这样的规则, 对二叉搜索树进行中序遍历就得得到一个有序的序列 。

二叉搜索树算法的排序规则:

a.选择第一个元素作为根节点;

b.之后如果元素大于根节点放在右子树, 如果元素小于根节点, 则放在左子树;

c.最后按照中序遍历的方式进行输出, 则可以得到排序的结果(左->根->右) ;

4.均衡二叉树 (Balanced Binary Tree)

均衡二叉树指的是一个节点的左右子树的高度差值不能大于1, 均衡二叉树一般都是在二叉搜索树的基础之上添加自动维持平衡的性质, 这种树的插入, 搜索, 删除的综合效率比较高。

5.完美二叉树 (Perfect binary Tree)

完美二叉树是理想中的一种二叉树, 这种树的特点就是非常完美, 每个节点都有两个孩子节点, 并且每层都被完全填充, 完美二叉树的叶子节点的高度都是一样。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
构建二叉树的算法可以使用递归或迭代的方式实现。 以下是使用递归方式构建二叉树的示例代码: ``` class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class BinaryTree { public TreeNode buildTree(int[] preorder, int[] inorder) { if (preorder == null || inorder == null || preorder.length != inorder.length) { return null; } return buildTreeHelper(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1); } private TreeNode buildTreeHelper(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) { if (preStart > preEnd || inStart > inEnd) { return null; } int rootVal = preorder[preStart]; int rootIndex = 0; for (int i = inStart; i <= inEnd; i++) { if (inorder[i] == rootVal) { rootIndex = i; break; } } int leftSize = rootIndex - inStart; TreeNode root = new TreeNode(rootVal); root.left = buildTreeHelper(preorder, inorder, preStart + 1, preStart + leftSize, inStart, rootIndex - 1); root.right = buildTreeHelper(preorder, inorder, preStart + leftSize + 1, preEnd, rootIndex + 1, inEnd); return root; } } ``` 以上代码中,`buildTree`方法接受两个数组,一个是先序遍历序列,一个是中序遍历序列。通过先序遍历序列的第一个节点确定根节点,在中序遍历序列中找到根节点的位置,根节点左边的节点为左子树,右边的节点为右子树。递归调用`buildTreeHelper`方法建立左右子树,并将其连接到根节点上。 以下是使用迭代方式构建二叉树的示例代码: ``` class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class BinaryTree { public TreeNode buildTree(int[] preorder, int[] inorder) { if (preorder == null || inorder == null || preorder.length != inorder.length) { return null; } Stack<TreeNode> stack = new Stack<>(); TreeNode root = new TreeNode(preorder[0]); stack.push(root); int inorderIndex = 0; for (int i = 1; i < preorder.length; i++) { TreeNode node = stack.peek(); if (node.val != inorder[inorderIndex]) { node.left = new TreeNode(preorder[i]); stack.push(node.left); } else { while (!stack.isEmpty() && stack.peek().val == inorder[inorderIndex]) { node = stack.pop(); inorderIndex++; } node.right = new TreeNode(preorder[i]); stack.push(node.right); } } return root; } } ``` 以上代码中,使用栈来辅助构建二叉树。先将先序遍历序列的第一个节点作为根节点入栈,然后依次遍历先序遍历序列中的每个节点,如果当前节点不等于中序遍历序列中的节点,则表示当前节点是根节点的左子树,将其作为左子节点入栈;否则,不断弹出栈顶元素,直到栈顶元素等于中序遍历序列中的节点,表示当前节点是某个节点的右子树,将其作为右子节点入栈。最终返回根节点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值