重构二叉树
来源:互联网 发布:淘宝配眼镜靠谱吗 编辑:程序博客网 时间:2024/05/16 00:57
二叉树的遍历常见方式
- 前序遍历,先访问跟节点,在访问子结点,最后访问右子结点顺序是abdefgc
- 中序遍历,先访问左子结点,再访问根结点,最后访问右子结点debgfac
- 后序遍历,先访问左子结点,在访问右子结点,最后访问更结点edgfbca
- 宽度优先遍历,先访问树的第一层结点,再访问树的第二层结点,一致到访问到最下面一层结点,同一层结点,从左到右一次遍历abcdfeg
重构二叉树
输入二叉树的前序遍历和中序遍历都不含重复数字,重建该二叉树
思路:已知前序找根结点,然后判断跟结点在中序输出中的位置,根节点左边的就是左子树,右边就是右子树,递归查找
public static void test4() { int[] frontOrder = {1, 2, 4, 7, 3, 5, 6, 8}; int[] inOrder = {4, 7, 2, 1, 5, 3, 8, 6}; BinaryTreeNode root = BinaryTree(frontOrder, inOrder); printPostOrder(root); } public static void printPostOrder(BinaryTreeNode root) { if (root != null) { printPostOrder(root.getLeft()); printPostOrder(root.getRight()); System.out.println(root.getValue()); } } public static BinaryTreeNode BinaryTree(int[] frontOrder, int[] inOrder) { //根据前序结点获取当前的跟结点 BinaryTreeNode root = new BinaryTreeNode(frontOrder[0]); root.setLeft(null); root.setRight(null); int leftLength = 0; //从中序结点中获取前序结点这个数所在的位置,因为中序结点中左侧是左字数,右侧是右字数 for (int i = 0; i < inOrder.length; i++) { if (inOrder[i] == root.getValue()) { break; } else { leftLength++; } } //获取右子树的个数 int rightLength = inOrder.length - leftLength - 1; if (leftLength > 0) { //再次初始化左侧的左子树 int[] leftFrontOrder = new int[leftLength]; int[] leftInorder = new int[leftLength]; for (int j = 0; j < leftLength; j++) { //因为第一个被取走了 leftFrontOrder[j] = frontOrder[j + 1]; leftInorder[j] = inOrder[j]; } BinaryTreeNode leftRoot = BinaryTree(leftFrontOrder, leftInorder); root.setLeft(leftRoot); } //再次初始化右侧的右子树 if (rightLength > 0) { int[] rightFrontOrder = new int[rightLength]; int[] rightInorder = new int[rightLength]; for (int k = 0; k < rightLength; k++) { rightFrontOrder[k] = frontOrder[k + 1 + leftLength]; rightInorder[k] = inOrder[k + 1 + leftLength]; } BinaryTreeNode rightRoot = BinaryTree(rightFrontOrder, rightInorder); root.setRight(rightRoot); } return root; }public class BinaryTreeNode { private int value; private BinaryTreeNode left; private BinaryTreeNode right; public BinaryTreeNode(int value){ this.value = value; } public BinaryTreeNode(int value,BinaryTreeNode left,BinaryTreeNode right){ this.value = value; this.left = left; this.right = right; } public int getValue( ){ return this.value; } public void setValue(BinaryTreeNode node){ this.value = value; } public void setLeft(BinaryTreeNode node){ this.left = node; } public void setRight(BinaryTreeNode node){ this.right = node; } public BinaryTreeNode getLeft( ){ return this.left; } public BinaryTreeNode getRight( ){ return this.right; }}
0 0
- 重构二叉树
- 重构二叉树
- 二叉树 重构
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 3.重构二叉树
- 重构二叉树&&判断二叉树的子结构
- 根据二叉树遍历的结果重构二叉树
- ACM 重构二叉树 C++实现
- 请实现一个函数,将一个字符串中的空格替换成“%20”。
- block和delegate区别以及使用
- MyEclipse链接DB Browser出现Java.lang.RuntimeException: Could not generate DH keypair
- matlab 视频播放初学
- LA 4850 Installations 贪心 *
- 重构二叉树
- Struts学习笔记(2)
- 见缝插针案例制作
- 【杭电】2089 不要62【打表】
- 众筹之家9月股权众筹行业简报
- is-a接口继承和has-a实现继承
- lsof
- 进程间通信——IPC(InterProcess Communication)
- uiautomator搭建