1. 程式人生 > >二叉樹相關知識總結(二)

二叉樹相關知識總結(二)

是否 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 = 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; } } }
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;
        }
    }
}
運行結果如下: 技術分享圖片 下一篇我們研究下,二叉查找樹。

二叉樹相關知識總結(二)