package ch11;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class LinkBinTree <T>{

    public static class TreeNode
    {
        Object data;
        TreeNode left;
        TreeNode right;
        public TreeNode()
        {
            
        }
        public TreeNode(Object data)
        {
            this.data = data;
            left = null;
            right = null;
        }
        public TreeNode(Object data,TreeNode left,TreeNode right)
        {
            this.data = data;
            this.left = left;
            this.right = right;
        }
    }
    private TreeNode root;
    public LinkBinTree()
    {
        this.root = new TreeNode();
    }
    //以指定根元素创建二叉树
    public LinkBinTree(T data)
    {
        this.root = new TreeNode(data);
    }
    //为指定节点添加子节点
    public TreeNode addNode(TreeNode parent, T data,boolean isLeft)
    {
        if(parent == null)
            throw new RuntimeException("节点为null,无法添加子节点");
        if(isLeft && parent.left != null)
            throw new RuntimeException(parent+"节点已经有左子节点,无法添加左子节点");
        if(!isLeft && parent.right!=null)
            throw new RuntimeException(parent+"节点已经有右子节点,无法添加右子节点");
        TreeNode newNode = new TreeNode(data);
        if(isLeft)
            parent.left = newNode;
        else
            parent.right  = newNode;
        return newNode;
    }
    //判空
    public boolean empty()
    {
        return root.data ==null;
    }
    //返回固定节点的左子节点
    public T leftChild(TreeNode parent)
    {
        if(parent ==null)
            throw new RuntimeException("节点为Null,没有子节点");
        return parent.left == null?null:(T)parent.left.data;
    }
    public T rightChild(TreeNode parent)
    {
        if(parent ==null)
            throw new RuntimeException("节点为Null,没有子节点");
        return parent.right == null?null:(T)parent.right.data;
    }
    
    public TreeNode root()
    {
        if(empty())
            throw new RuntimeException("树为空,无法访问根节点");
        return root;
    }
    public T parent(TreeNode node)
    {
        return null;
    }
    //递归,每棵子树的额深度为其所有子树的最大深度+1
    public int deep(TreeNode node)
    {
        if(node == null)
            return 0;
        else{
            int leftDeep = deep(node.left);
            int rightDeep  = deep(node.right);
            int max = leftDeep>rightDeep?leftDeep:rightDeep;
            return max+1;
        }
    }
    
    //先序遍历二叉树
    public List<TreeNode> preIterator()
    {
        return preIterator(root);
    }
    public List<TreeNode> preIterator(TreeNode node)
    {
        List<TreeNode> list = new ArrayList<TreeNode>();
        //处理根节点
        list.add(node);
        if(node.left!=null)
            list.addAll(preIterator(node.left));
        if(node.right!=null)
            list.addAll(preIterator(node.right));
        return list;
    }
    
    //中序遍历
    public List<TreeNode> inIteratror()
    {
        return inIterator(root);
    }
    private List<TreeNode> inIterator(TreeNode node)
    {
        List<TreeNode> list = new ArrayList<TreeNode>();
        if(node.left!= null)
            list.addAll(inIterator(node.left));
        list.add(node);
        if(node.right!=null)
            list.addAll(inIterator(node.right));
        return list;
    }
    //非递归先序遍历二叉树
    public List<TreeNode> nonCursivePreIterator(TreeNode node){
        Stack<TreeNode>stack = new Stack<TreeNode> ();
        List<TreeNode> list  = new ArrayList<TreeNode>();
        list.add(node);
        while(node!=null || !stack.empty())
        {
            while(node!=null)
            {
                //System.out.println(node.data);
                list.add(node);
                stack.push(node);
                node=node.left;
            }
            if(!stack.empty())
            {
                node = stack.pop();
                node = node.right;
            }
        }
        return list;
        
    }
}

 

 

 

package ch11;

import java.util.List;

import ch11.LinkBinTree.TreeNode;

public class LinkBinTreeTest {

    public static void main(String[] args){
        LinkBinTree<String> binTree = new LinkBinTree<String>("根节点");
        TreeNode tn1= binTree.addNode(binTree.root(), "第二层左节点", true);
        TreeNode tn2 = binTree.addNode(binTree.root(), "第二层右节点", false);
        TreeNode tn3 = binTree.addNode(tn2,"第三层左节点", true);
        TreeNode tn4 = binTree.addNode(tn2,"第三层右节点",false);
        TreeNode tn5 = binTree.addNode(tn3, "第四层左节点", true);
        System.out.println("根节点是哪个?"+binTree.root().data);
        System.out.println("tn2的左子节点是: "+binTree.leftChild(tn2));
        System.out.println("tn2的右子节点是: "+binTree.rightChild(tn2));
        System.out.println(binTree.deep(binTree.root()));
        
        /*List<TreeNode> list = binTree.inIteratror();
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).data);
        }*/
        List<TreeNode> list  = binTree.nonCursivePreIterator(binTree.root());
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).data);
        }
    }
}

 

posted on 2014-02-24 01:09  happinessqi  阅读(540)  评论(0编辑  收藏  举报