二叉树(四)——完整代码(java版)
来源:互联网 发布:阿尔法柜门设计软件 编辑:程序博客网 时间:2024/05/06 21:38
class BinaryTreeTest{ public static void main(String[] args){ TreeNode<String> right12 = new TreeNode<String>("G", null, null); TreeNode<String> left1 = new TreeNode<String>("D", null, right12); TreeNode<String> left2 = new TreeNode<String>("E", null, null); TreeNode<String> right2 = new TreeNode<String>("F", null, null); TreeNode<String> left = new TreeNode<String>("B", left1, null); // 根节点左子树 TreeNode<String> right = new TreeNode<String>("C", left2, right2); // 根节点右子树 TreeNode<String> root = new TreeNode<String>("A", left,right); // 创建根节点 //完成二叉树的构建 BinaryTree bt1 = new BinaryTree(root); System.out.println("=======递归先序遍历======"); bt1.preOrder(bt1.getRoot()); System.out.println("=======非递归先序遍历======"); bt1.preOrder1(bt1.getRoot()); System.out.println("=======递归中序遍历======"); bt1.inOrder(bt1.getRoot()); System.out.println("=======非递归中序遍历======"); bt1.inOrder1(bt1.getRoot()); System.out.println("========递归后续遍历======="); bt1.postOrder(bt1.getRoot()); System.out.println("========非递归后续遍历======="); bt1.postOrder1(bt1.getRoot()); System.out.println("==========="); System.out.println("结点个数为:"+bt1.getSize(bt1.getRoot())); System.out.println("二叉树的高度为:"+bt1.getHeight()); System.out.println("G的父节点为:"+bt1.getParent(right2).getData()); String[] preorder = {"A","B","D","G","C","E","F"}; String[] inorder1 = {"D","G","B","A","E","C","F"}; BinaryTree bt2 = new BinaryTree(); TreeNode root1 = bt2.buildTree(preorder,inorder1);//已知先序和中序构造二叉树 System.out.println("========递归后续遍历======="); bt2.postOrder(root1); System.out.println("=======非递归后序遍历======"); bt2.postOrder1(root1); String[] inorder2 = {"D","G","B","A","E","C","F"}; String[] postorder = {"G","D","B","E","F","C","A"}; BinaryTree bt3 = new BinaryTree(); TreeNode root2 = bt3.buildTree1(inorder2,postorder);//已知中序和后序构造二叉树 System.out.println("=======递归先序遍历======"); bt3.preOrder(root2); System.out.println("=======非递归先序遍历======"); bt3.preOrder1(root2); }}class BinaryTree{ private TreeNode root;//根节点 public BinaryTree(){ } //传入根节点的值 public BinaryTree(TreeNode root){ this.root = root; } //获取根节点的值 public TreeNode getRoot(){ return root; } //修改根节点的值 public void setRoot(TreeNode root){ this.root = root; } /* 返回父节点 */ public TreeNode getParent(TreeNode element){ return (root == null || root == element) ? null : parent(root,element); } private TreeNode parent(TreeNode subTree,TreeNode element){ if(subTree == null) return null; if(subTree.getLeftChild() == element || subTree.getRightChild() == element) //返回父节点地址 return subTree; TreeNode p; if((p = parent(subTree.getLeftChild(),element)) != null) //递归在左子树中搜索 return p; else //递归在右子树中搜索 return parent(subTree.getRightChild(),element); } /* 求节点个数 */ public int getSize(TreeNode root){ return getNum(root); } private int getNum(TreeNode node){ if(node == null) return 0; else{ int i = getNum(node.getLeftChild()); //System.out.println("****"); //System.out.println(i); //System.out.println("****"); int j = getNum(node.getRightChild()); //System.out.println("----"); //System.out.println(j); //System.out.println("----"); return i + j + 1; } } /* 求高度 */ public int getHeight(){ return getDepth(root); } private int getDepth(TreeNode node){ if(node == null) return 0; else{ int i = getDepth(node.getLeftChild()); int j = getDepth(node.getRightChild()); return(i > j)?(i + 1):(j + 1); } } /* 先序遍历递归算法 */ public void preOrder(TreeNode node){ if (node != null){ System.out.println(node.getData()); preOrder(node.getLeftChild()); preOrder(node.getRightChild()); } } /* 先序遍历非递归算法 */ public void preOrder1(TreeNode node){ TreeNode p; TreeNode[] St = new TreeNode[getSize(node)]; int top = -1; if(node != null){ top ++; St[top] = node; while(top > -1){ p = St[top]; top --; System.out.println(p.getData()); if(p.getRightChild() != null){ top ++; St[top] = p.getRightChild(); } if(p.getLeftChild() != null){ top ++; St[top] = p.getLeftChild(); } } } } /* 中序遍历递归算法 */ public void inOrder(TreeNode node){ if(node != null){ inOrder(node.getLeftChild()); System.out.println(node.getData()); inOrder(node.getRightChild()); } } /* 中序遍历非递归算法 */ public void inOrder1(TreeNode node){ TreeNode p; TreeNode[] St = new TreeNode[getSize(node)]; int top = -1; if(node != null){ p = node; while(top > -1 || p != null){ while(p != null){ top ++; St[top] = p; p = p.getLeftChild(); } if(top > -1){ p = St[top]; top --; System.out.println(p.getData()); p = p.getRightChild(); } } } } /* 后序遍历递归算法 */ public void postOrder(TreeNode node){ if(node != null){ postOrder(node.getLeftChild()); postOrder(node.getRightChild()); System.out.println(node.getData()); } } /* 后序遍历非递归算法 */ public void postOrder1(TreeNode node){ TreeNode p; TreeNode[] St = new TreeNode[getSize(node)]; int top = -1,flag = 0; if(node != null){ do{ while(node != null){ top ++; St[top] = node; node = node.getLeftChild(); } p =null; flag = 1; while(top != -1 && flag == 1){ node = St[top]; if(node.getRightChild() == p){ System.out.println(node.getData()); top --; p = node; } else{ node = node.getRightChild(); flag = 0; } } }while(top != -1); } } /* 寻找根结点 */ private int findPosition(String[] arr, int start, int end, String key) { int i; for (i = start; i <= end; i++) { if (arr[i] == key) { return i; } } return -1; } /* 已知先序和中序 构造二叉树 */ private TreeNode myBuildTree(String[] inorder, int instart, int inend, String[] preorder, int prestart, int preend) { if (instart > inend) { return null; } TreeNode<String> head = new TreeNode<String>(preorder[prestart]); int position = findPosition(inorder, instart, inend, preorder[prestart]); head.setLeftChild(myBuildTree(inorder, instart, position - 1, preorder, prestart + 1, prestart + position - instart)); head.setRightChild(myBuildTree(inorder, position + 1, inend, preorder, position - inend + preend + 1, preend)); return head; } public TreeNode buildTree(String[] preorder, String[] inorder) { if (inorder.length != preorder.length) { return null; } return myBuildTree(inorder, 0, inorder.length - 1, preorder, 0, preorder.length - 1); } /* 已知中序和后序 构造二叉树 */ private TreeNode myBuildTree1(String[] inorder, int instart, int inend, String[] postorder, int poststart, int postend) { if (instart > inend) { return null; } TreeNode<String> head1 = new TreeNode<String>(postorder[postend]); int position = findPosition(inorder, instart, inend, postorder[postend]); head1.setLeftChild(myBuildTree1(inorder, instart, position - 1, postorder, poststart, poststart + position - instart - 1)); head1.setRightChild(myBuildTree1(inorder, position + 1, inend, postorder, poststart + position - instart, postend - 1)); return head1; } public TreeNode buildTree1(String[] inorder, String[] postorder) { if (inorder.length != postorder.length) { return null; } return myBuildTree1(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1); }}/* 定义结点类*/class TreeNode<T>{ private T data = null;//数据部分 private TreeNode leftChild;//左孩子结点 private TreeNode rightChild;//右孩子结点 public TreeNode(){ } public TreeNode(T data){ this.data = data; } public TreeNode(T data,TreeNode leftChild,TreeNode rightChild){ this.data = data; this.leftChild = leftChild; this.rightChild = rightChild; } //获取数据 public T getData(){ return data; } //修改数据 public void setData(T data){ this.data = data; } //获取左孩子结点 public TreeNode getLeftChild(){ return leftChild; } //修改左孩子结点 public void setLeftChild(TreeNode leftChild){ this.leftChild = leftChild; } //获取右孩子结点 public TreeNode getRightChild(){ return rightChild; } //修改右孩子结点 public void setRightChild(TreeNode rightChild){ this.rightChild = rightChild; }}
0 0
- 二叉树(四)——完整代码(java版)
- 二叉平衡树的基本操作(完整代码)
- 二叉查找树 C++实现(含完整代码)
- 【数据结构】二叉树之堆排序(完整代码)
- 线索二叉树的完整代码实现
- 二叉树的四种遍历(java代码)
- Java二叉树代码
- 二叉树(四)
- 求二叉树中节点间的最大距离(c++代码完整实现)
- 数据结构(十五) 线索二叉树讲解(带头节点中序加线索) 以及实现的完整代码
- 数据结构(十六) 线索二叉树讲解(带头节点后序加线索) 以及实现的完整代码
- 创建二叉查找树的完整C代码
- 二叉树(java)代码实现
- 数据结构之--二叉树(Java代码)
- java版 仿qq代码 完整源码 (已测试)
- C++数据结构(四)——二叉树
- 二叉树完整练习
- 【选择图片Jar】拨云见日-GalleryAdapter完整代码(四)
- ECMAScript6笔记:变量的解构赋值
- 小小动画效果
- 查找算法
- 数据库查询集锦
- git 命令的使用(一)
- 二叉树(四)——完整代码(java版)
- (Java)Lambda表达式简单入门学习
- php中逻辑运算的短路算法
- Android Studio教程从入门到精通Windows版 - 提高篇
- java学习--集合框架
- nyoj1100
- 每周TODO知识点总结 第一期
- [Lintcode]Rotate Image
- Java开发工具_Eclipse中如何生成jar包并导入到新的项目中