java 二叉树遍历+查找祖先节点

IDEA 的确比eclipse强大不少,并且界面更加美观。参考胡昭明《图解数据结构java》

《java 二叉树遍历+查找祖先节点》

import java.io.*;
import java.util.*;

//二叉树节点类声明
class TreeNode {
    int value;
    TreeNode left_Node;
    TreeNode right_Node;
    // TreeNode构造函数
    public TreeNode(int value) {
        this.value=value;
        this.left_Node=null;
        this.right_Node=null;
    }
}
//二叉树类声明
class BinaryTree {
    public TreeNode rootNode; //二叉树的根节点
    public BinaryTree(int[] data){
        for(int i=0;i<data.length;i++)
            Add_Node_To_Tree(data[i]);
    }
    public BinaryTree(){

    }
    // 将指定的值加入到二叉树中适当的节点
    void Add_Node_To_Tree(int value) {
        TreeNode currentNode=rootNode;
        if(rootNode==null) { //建立树根
            rootNode=new TreeNode(value);
            return;
        }
        //建立二叉树
        while(true) {
            if (value<currentNode.value) { //在左子树
                if(currentNode.left_Node==null) {
                    currentNode.left_Node=new TreeNode(value);
                    return;
                }
                else currentNode=currentNode.left_Node;
            }
            else { //在右子树
                if(currentNode.right_Node==null) {
                    currentNode.right_Node=new TreeNode(value);
                    return;
                }
                else currentNode=currentNode.right_Node;
            }
        }
    }

    public void PreOrder(TreeNode node){
        if(node!=null){
            System.out.print("["+ node.value+"] ");
            PreOrder(node.left_Node);
            PreOrder(node.right_Node);
        }
    }

    public void PreOrder1(TreeNode node){
        if(node == null)
            return;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        stack.push(node);
        while(!stack.isEmpty()){
            while(stack.peek()!=null){
                System.out.print("["+stack.peek().value+"] ");
                stack.push(stack.peek().left_Node);
            }
            TreeNode p = stack.pop();
            if(!stack.isEmpty()){
                p = stack.pop();
                stack.push(p.right_Node);
            }
        }
    }



    public void PostOrder(TreeNode node){
        if(node!=null){
            PostOrder(node.left_Node);
            PostOrder(node.right_Node);
            System.out.print("["+node.value+"] ");
        }
    }

    public void PostOrder1(TreeNode node){
        TreeNode q = node;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        while(node!=null){
            for(;node.left_Node!=null;node = node.left_Node)
                stack.push(node);
            while(node!=null&&(node.right_Node==null)||node.right_Node==q){
                System.out.print("["+node.value+"] ");
                q = node;
                if(stack.empty())
                    return;
                node = stack.pop();
            }
            stack.push(node);
            node = node.right_Node;
        }

    }

    public void FindXAnCestor(TreeNode node,int x){
        TreeNode q = node;
        TreeNode bt;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        while(node!=null){

            for(;node.left_Node!=null;node =node.left_Node){
                if(node.value == x){
                    while(!stack.isEmpty()){
                        bt = stack.pop();
                        System.out.print("{"+bt.value+"} ");
                    }
                    return;
                }
                stack.push(node);
            }
            while(node!=null&&(node.right_Node==null)||node.right_Node == q){
                q = node;
                if(stack.empty())
                    return;
                node = stack.pop();
            }
            if(node.value == x){
                while(!stack.isEmpty()){
                    bt = stack.pop();
                    System.out.print("{"+bt.value+"}");
                }
                return;
            }
            stack.push(node);
            node = node.right_Node;
        }
    }

    public void InOrder(TreeNode node){
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode p = node;
        while(p!=null||!stack.isEmpty()){
            if(p!=null){
                stack.push(p);
                p = p.left_Node;
            }else{
                p = stack.pop();
                System.out.print("["+p.value+"] ");
                p = p.right_Node;
            }
        }
    }

    public void LelvelOrder(TreeNode node){
       if(node == null)
           return;
        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
        TreeNode current = null;
        queue.offer(node);
        while(!queue.isEmpty()){
            current = queue.poll();
            System.out.print("["+current.value+"]");
            if(current.left_Node!=null)
                queue.offer(current.left_Node);
            if(current.right_Node!=null)
                queue.offer(current.right_Node);
        }
    }
}
public class Dog{
    //主函数
    public static void main(String args[]) throws IOException {
        int ArraySize=6;
        int tempdata;
        int[] content=new int[ArraySize];
        BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请连续输入"+ArraySize+"个数据");
        for(int i=0;i<ArraySize;i++) {
            System.out.print("请输入第"+(i+1)+"个数据: ");
            tempdata=Integer.parseInt(keyin.readLine());
            content[i]=tempdata;
        }
        BinaryTree tree = new BinaryTree(content);
        System.out.println("\n先序遍历二叉树");
        tree.PreOrder(tree.rootNode);
        System.out.println("\n先序遍历1二叉树");
        tree.PreOrder1(tree.rootNode);
        System.out.println("\n后序遍历二叉树");
        tree.PostOrder(tree.rootNode);
        System.out.println("\n中序遍历二叉树");
        tree.InOrder(tree.rootNode);
        System.out.println("\n后序遍历1二叉树");
        tree.PostOrder1(tree.rootNode);
        System.out.println("\n层次遍历");
        tree.LelvelOrder(tree.rootNode);
        System.out.print("\n找到x的祖先(假设x只有一个)\n");
        tree.FindXAnCestor(tree.rootNode,5);
    }
}
    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/sinat_31741803/article/details/52753945
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞