二叉樹相關知識總結(二)
阿新 • • 發佈:2018-09-13
是否 integer string 根節點 color ast creat postorder ray
我們是否可以將每個節點都抽象為一個節點對象? 我們下面來嘗試下 二、代碼實現
二叉樹的Java實現
一、分析 一個二叉樹節點包含三個部分,分別是,指向左子樹的部分,指向右子樹的部分,數據部分,如下圖所示:我們是否可以將每個節點都抽象為一個節點對象? 我們下面來嘗試下 二、代碼實現
package com.example.demo.dataStructure.binaryTree; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class BinaryTree { List<TreeNode> datas = newArrayList<TreeNode>(); public static void main(String[] args) { BinaryTree tree = new BinaryTree(); Integer array[] = {1,2,3,4,5,6,7,8,9}; TreeNode node = tree.createBinaryTree(array); System.out.println("先根遍歷:"); tree.preOrderTraversal(node.getRoot()); System.out.println("中根遍歷:"); tree.inOrderTraversal(node.getRoot()); System.out.println("後根遍歷:"); tree.postOrderTraversal(node.getRoot()); } /** * 創建二叉樹 */ public TreeNode createBinaryTree(Object[] obj) { TreeNode root = new TreeNode(); Arrays.asList(obj).stream().forEach(object-> datas.add(new TreeNode(object))); for (int parentIndex = 0; parentIndex < obj.length / 2; parentIndex++) { // 左孩子 datas.get(parentIndex).setLeftChild(datas.get(parentIndex * 2 + 1)); // 右孩子 if (parentIndex * 2 + 2 < obj.length) { datas.get(parentIndex).setRightChild(datas.get(parentIndex * 2 + 2)); } } root.setRoot(datas.get(0)); return root; } /** * 先根遍歷 */ public void preOrderTraversal(TreeNode tree) { if (null == tree) { return; } System.out.print(tree.getData()); preOrderTraversal(tree.getLeftChild()); preOrderTraversal(tree.getRightChild()); } /** * 中根遍歷 */ public void inOrderTraversal(TreeNode tree) { if (null == tree) { return; } inOrderTraversal(tree.getLeftChild()); System.out.print(tree.getData()); inOrderTraversal(tree.getRightChild()); } /** * 後根遍歷 */ public void postOrderTraversal(TreeNode tree) { if (null == tree) { return; } postOrderTraversal(tree.getLeftChild()); postOrderTraversal(tree.getRightChild()); System.out.print(tree.getData()); } class TreeNode { private TreeNode leftChild; // 左孩子 private TreeNode rightChild; // 右孩子 private Object data; // 數據部分 private TreeNode root; // 標明根節點 public TreeNode() { super(); } // 初始化節點 public TreeNode(TreeNode leftChild, TreeNode rightChild, Object data) { super(); this.leftChild = leftChild; this.rightChild = rightChild; this.data = data; } // 初始化數據域 public TreeNode(Object data) { this(null, null, 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; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public TreeNode getRoot() { return root; } public void setRoot(TreeNode root) { this.root = root; } } }
package com.example.demo.dataStructure.binaryTree; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class BinaryTree { List<TreeNode> datas = new ArrayList<TreeNode>(); public static void main(String[] args) { BinaryTree tree = new BinaryTree(); Integer array[] = {1,2,3,4,5,6,7,8,9}; TreeNode node = tree.createBinaryTree(array); System.out.println("先根遍歷:"); tree.preOrderTraversal(node.getRoot()); System.out.println("中根遍歷:"); tree.inOrderTraversal(node.getRoot()); System.out.println("後根遍歷:"); tree.postOrderTraversal(node.getRoot()); } /** * 創建二叉樹 */ public TreeNode createBinaryTree(Object[] obj) { TreeNode root = new TreeNode(); Arrays.asList(obj).stream().forEach(object -> datas.add(new TreeNode(object))); for (int parentIndex = 0; parentIndex < obj.length / 2; parentIndex++) { // 左孩子 datas.get(parentIndex).setLeftChild(datas.get(parentIndex * 2 + 1)); // 右孩子 if (parentIndex * 2 + 2 < obj.length) { datas.get(parentIndex).setRightChild(datas.get(parentIndex * 2 + 2)); } } root.setRoot(datas.get(0)); return root; } /** * 先根遍歷 */ public void preOrderTraversal(TreeNode tree) { if (null == tree) { return; } System.out.print(tree.getData()); preOrderTraversal(tree.getLeftChild()); preOrderTraversal(tree.getRightChild()); } /** * 中根遍歷 */ public void inOrderTraversal(TreeNode tree) { if (null == tree) { return; } inOrderTraversal(tree.getLeftChild()); System.out.print(tree.getData()); inOrderTraversal(tree.getRightChild()); } /** * 後根遍歷 */ public void postOrderTraversal(TreeNode tree) { if (null == tree) { return; } postOrderTraversal(tree.getLeftChild()); postOrderTraversal(tree.getRightChild()); System.out.print(tree.getData()); } class TreeNode { private TreeNode leftChild; // 左孩子 private TreeNode rightChild; // 右孩子 private Object data; // 數據部分 private TreeNode root; // 標明根節點 public TreeNode() { super(); } // 初始化節點 public TreeNode(TreeNode leftChild, TreeNode rightChild, Object data) { super(); this.leftChild = leftChild; this.rightChild = rightChild; this.data = data; } // 初始化數據域 public TreeNode(Object data) { this(null, null, 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; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public TreeNode getRoot() { return root; } public void setRoot(TreeNode root) { this.root = root; } } }運行結果如下: 下一篇我們研究下,二叉查找樹。
二叉樹相關知識總結(二)