码迷,mamicode.com
首页 > 其他好文 > 详细

线索化二叉树

时间:2021-02-27 13:26:03      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:setname   root   子节点   tree   实现   bin   nbsp   binary   rgba   

package com.dai.tree.threadedbinarytree;

public class ThreadedBinaryTreeDemo {

    public static void main(String[] args) {
        //测试中序线索二叉树功能是否正确
        HeroNode root = new HeroNode(1, "Tom");
        HeroNode node2 = new HeroNode(3, "jack");
        HeroNode node3 = new HeroNode(6, "huahua");
        HeroNode node4 = new HeroNode(8, "mary");
        HeroNode node5 = new HeroNode(10, "king");
        HeroNode node6 = new HeroNode(14, "dim");
        //手动创建
        root.setLeft(node2);
        root.setRight(node3);
        node2.setLeft(node4);
        node2.setRight(node5);
        node3.setLeft(node6);
        
        ThreadedBinaryTree threadedBinaryTree = new ThreadedBinaryTree();
        threadedBinaryTree.setRoot(root);
        threadedBinaryTree.threadedNodes();
        //测试10号节点
        HeroNode leftNode = node5.getLeft();
        HeroNode rightNode = node5.getRight();
        System.out.println("10号节点的前驱节点是:" + leftNode);
        System.out.println("10号节点的后继节点是:" + rightNode);
    }

}

//定义threadedBinaryTree 二叉树
class ThreadedBinaryTree{
    private HeroNode root;
    //为实现线索化,需要创建要给指向当前节点的前驱节点的指针
    private HeroNode pre = null;
    //递归线索化时,pre总是保留前一个节点
    public void setRoot(HeroNode root) {
        this.root = root;
    } 
    //重载线索化二叉树的方法
    public void threadedNodes() {
        this.threadedNodes(root);
    }
    //编写对二叉树中序线索化的代码
    /**
     * 
     * @param node:当前需要线索化的节点
     */
    public void threadedNodes(HeroNode node) {
        if(node == null) {
            return ; //节点为空直接返回
        }
        //线索化左子树
        threadedNodes(node.getLeft());
        if(node.getLeft() == null) {
            node.setLeft(pre);
            node.setLeftType(1);
        }
        if(pre != null && pre.getRight() == null) {
            pre.setRight(node);
            pre.setRightType(1);
        }
        pre = node;
        
        //线索化右子树
        threadedNodes(node.getRight());
        
        
    }
    //删除节点
    public void delNode(int no) {
        if(root != null) {
        //如果只有一个root节点,这里需要判断root是不是要删除的节点。
            if(root.getNo() == no) {
                root = null;
            }else {
                //递归删除
                root.delNode(no);
            }
            
        }else {
            System.out.println("树空,无法删除");
        }
    }
    //前序遍历
    public void preOrder() {
        if(this.root != null) {
            this.root.preOrder();
        }else {
            System.out.println("二叉树为空,无法遍历");
        }
    }
    
    //中序遍历
    public void infixOrder() {
        if(this.root != null) {
            this.root.infixOrder();
        }else {
            System.out.println("二叉树为空,无法遍历");
        }
    }
    
    //后序遍历
    public void postOrder() {
        if(this.root != null) {
            this.root.postOrder();
        }else {
            System.out.println("二叉树为空,无法遍历");
        }
    }
    //前序遍历查找
    public HeroNode preOrderSearch(int no) {
        if(root != null) {
            return root.preOrdersearch(no);
        }else {
            return null;
        }
    }
    
    //中序遍历查找
    public HeroNode infixOrderSearch(int no) {
        if(root != null) {
            return root.infixOrdersearch(no);
        }else {
            return null;
        }
    }
        //后序遍历查找
    public HeroNode postOrderSearch(int no) {
        if(root != null) {
            return root.postOrdersearch(no);
        }else {
            return null;
        }
    }
}

//节点类
class HeroNode{
    private int no;
    private String name;
    private HeroNode left;
    private HeroNode right;
    //leftType为0表示左子树,1表示指向前驱节点
    //rightType为0表示右子树,1表示后继
    private int leftType;
    private int rightType;

    public HeroNode(int no, String name) {
        this.no = no;
        this.name = name;
    }
    
    public int getLeftType() {
        return leftType;
    }

    public void setLeftType(int leftType) {
        this.leftType = leftType;
    }

    public int getRightType() {
        return rightType;
    }

    public void setRightType(int rightType) {
        this.rightType = rightType;
    }

    public int getNo() {
        return no;
    }
    public void setNo(int no) {
        this.no = no;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public HeroNode getLeft() {
        return left;
    }
    public void setLeft(HeroNode left) {
        this.left = left;
    }
    public HeroNode getRight() {
        return right;
    }
    public void setRight(HeroNode right) {
        this.right = right;
    }
    
    @Override
    public String toString() {
        return "HeroNode [no=" + no + ", name=" + name + "]";
    }
    
    //递归删除节点
    //叶子节点则删除,非叶子节点,则要删除子树
    public void delNode(int no) {
        if(this.left != null && this.left.no == no) {
            this.left = null;
            return;
        }
        if(this.right != null && this.right.no ==no) {
            this.right = null ;
            return ;
        }
        if(this.left != null) {
            this.left.delNode(no);
        }
        if(this.right != null) {
            this.right.delNode(no);
        }
    }
    
    //编写前序遍历的方法
    public void preOrder() {
        System.out.println(this); //
        //递归向左子数
        if(this.left != null) {
            this.left.preOrder();
        }
        //递归向右前序遍历
        if(this.right!=null) {
            this.right.preOrder();
        }
        
    }
    //中序遍历
    public void infixOrder() {
        //递归向左子树中序遍历
        if(this.left != null) {
            this.left.infixOrder();
        }
        System.out.println(this);
        if(this.right != null) {
            this.right.infixOrder();
        }
    }
    
    //后续遍历
    public void postOrder() {
        if(this.left != null) {
            this.left.postOrder();
        }
        if(this.right != null) {
            this.right.postOrder();
        }
        System.out.println(this);
    }
    //前序遍历查找
    public HeroNode preOrdersearch(int no) {
        //比较当前节点是不是
        if(this.no==no) {
            return this;
        }
        HeroNode resNode =null;
        if(this.left != null) {
            resNode = this.left.preOrdersearch(no);
        }
        if(resNode != null) {
            return resNode;
        }
        if(this.right != null) {
            resNode = this.right.preOrdersearch(no);
        }
        return resNode;
    }
    //中序遍历查找
    public HeroNode infixOrdersearch(int no) {
        
        HeroNode resNode =null;
        if(this.left != null) {
            resNode = this.left.infixOrdersearch(no);
        }
        if(resNode != null) {
            return resNode;
        }
        if(this.no==no) {
            return this;
        }
        if(this.right != null) {
            resNode = this.right.infixOrdersearch(no);
        }
        return resNode;
    }
        //后序遍历查找
        public HeroNode postOrdersearch(int no) {
            HeroNode resNode =null;
            if(this.left != null) {
                resNode = this.left.postOrdersearch(no);
            }
            if(resNode != null) {
                return resNode;
            }
            if(this.right != null) {
                resNode = this.right.postOrdersearch(no);
            }
            if(resNode != null) {
                return resNode;
            }
            
            if(this.no==no) {
                return this;
            }
            return resNode;
        }
}

 

线索化二叉树

标签:setname   root   子节点   tree   实现   bin   nbsp   binary   rgba   

原文地址:https://www.cnblogs.com/shengtudai/p/14454511.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!