《Java語言程序設計與數據結構》編程練習答案(第二十五章)(一)

《Java語言程序設計與數據結構》編程練習答案(第二十五章)(一)

英文名:Introduction to Java Programming and Data Structures, Comprehensive Version, 11th Edition

25.1

public class book {


    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);


    }
}

interface Tree<T> extends Collection<T>{
    public boolean search(T e);

    public boolean insert(T e);
    public boolean delete(T e);

    public int getSize();

    public default void inorder(){}
    public default void postorder(){}
    public default void preorder(){}

    @Override
    public default boolean isEmpty(){
        return size() == 0;
    }

    @Override
    public default boolean contains(Object e){
        return search((T) e);
    }

    @Override
    public default boolean add(T e){
        return insert(e);
    }

    @Override
    public default boolean remove(Object e){
        return delete((T) e);
    }

    @Override
    public default int size(){
        return getSize();
    }

    @Override
    public default boolean containsAll(Collection<?> c){
        return false;
    }

    @Override
    public default boolean addAll(Collection<? extends T> c){
        return false;
    }

    @Override
    public default boolean removeAll(Collection<?> c){
        return false;
    }

    @Override
    public default boolean retainAll(Collection<?> c){
        return false;
    }

    @Override
    public default Object[] toArray(){
        return null;
    }

    @Override
    public default <T> T[] toArray(T[] array){
        return null;
    }
}

class BST<T extends Comparable<T>> implements Tree<T>{

    protected TreeNode<T> root;
    protected int size = 0;

    public BST(){}
    public BST(T[] objects){
        for(T o: objects){
            add(o);
        }
    }

    @Override
    public boolean search(T e) {
        TreeNode<T> current = root;

        while (current != null){
            if(e.compareTo(current.element) < 0){
                current = current.left;
            }
            else if(e.compareTo(current.element) > 0){
                current = current.right;
            }
            else{
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean insert(T e) {
        if(root == null){
            root = createNewNode(e);
        }else{
            TreeNode<T> parent = null;
            TreeNode<T> current = root;
            while (current != null){
                if(e.compareTo(current.element) < 0){
                    parent = current;
                    current = current.left;
                }
                else if(e.compareTo(current.element) > 0){
                    parent = current;
                    current = current.right;
                }
                else{
                    return false;
                }
            }
            if(e.compareTo(parent.element) < 0){
                parent.left = createNewNode(e);
            }else{
                parent.right = createNewNode(e);
            }
        }
        size++;
        return true;
    }

    protected TreeNode<T> createNewNode(T e){
        return new TreeNode<>(e);
    }

    @Override
    public void inorder(){
        inorder(root);
    }

    protected void inorder(TreeNode<T> root){
        if(root == null){
            return;
        }
        inorder(root.left);
        System.out.print(root.element+" ");
        inorder(root.right);
    }

    @Override
    public void postorder(){
        postorder(root);
    }

    protected void postorder(TreeNode<T> root){
        if(root == null){
            return;
        }
        postorder(root.left);
        postorder(root.right);
        System.out.print(root.element+" ");
    }

    @Override
    public void preorder(){
        preorder(root);
    }

    protected void preorder(TreeNode<T> root){
        if(root == null){
            return;
        }
        System.out.print(root.element+" ");
        preorder(root.left);
        preorder(root.right);
    }

    @Override
    public boolean delete(T e) {
        TreeNode<T> parent = null;
        TreeNode<T> current = root;
        while(current != null){
            if(e.compareTo(current.element) < 0){
                parent = current;
                current = current.left;
            }
            else if(e.compareTo(current.element) > 0){
                parent = current;
                current = current.right;
            }
            else{
                break;
            }
        }

        if(current == null){
            return false;
        }
        if(current.left == null){
            if(parent == null){
                root = current.right;
            }
            else{
                if(e.compareTo(parent.element) < 0){
                    parent.left = current.right;
                }
                else{
                    parent.right = current.right;
                }
            }
        }
        else{
            TreeNode<T> parentOfRightMost = current;
            TreeNode<T> rightMost = current.left;

            while(rightMost.right != null){
                parentOfRightMost = rightMost;
                rightMost = rightMost.right;
            }
            current.element = rightMost.element;
            if(parentOfRightMost.right == rightMost){
                parentOfRightMost.right = rightMost.left;
            }else{
                parentOfRightMost.left = rightMost.left;
            }
        }
        size--;
        return true;
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public Iterator<T> iterator() {
        return null;
    }

    private class InorderIterator implements Iterator<T>{

        private ArrayList<T> list = new ArrayList<>();
        private int current = 0;

        public InorderIterator(){
            inorder();
        }

        private void inorder(){
            inorder(root);
        }

        private void inorder(TreeNode<T> root){
            if(root == null)
                return;
            inorder(root.left);
            list.add(root.element);
            inorder(root.right);
        }

        @Override
        public boolean hasNext(){
            return current < list.size();
        }

        @Override
        public T next(){
            return list.get(current++);
        }
    }

    @Override
    public void clear() {
        root = null;
        size = 0;
    }

    public static class TreeNode<T>{
        protected T element;
        protected TreeNode<T> left;
        protected TreeNode<T> right;

        public TreeNode(T e){
            element = e;
        }
    }

    //exercise 25.1
    public void breadthFirstTraversal(){
        ArrayList<TreeNode<T>> list = new ArrayList<>();
        if(root == null)
            return;
        list.add(root);
        while(!list.isEmpty()){
            TreeNode<T> current = list.remove(0);
            System.out.print(current.element+" ");
            if(current.left != null)
                list.add(current.left);
            if(current.right != null)
                list.add(current.right);
        }
    }

    public int height(){
        return height(root);
    }

    private int height(TreeNode<T> root){
        if(root == null)
            return 0;
        else{
            if(height(root.left) > height(root.right)){
                return height(root.left) + 1;
            }
            else{
                return height(root.right) + 1;
            }
        }
    }
}

25.2

public class book {


    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);


    }
}

interface Tree<T> extends Collection<T>{
    public boolean search(T e);

    public boolean insert(T e);
    public boolean delete(T e);

    public int getSize();

    public default void inorder(){}
    public default void postorder(){}
    public default void preorder(){}

    @Override
    public default boolean isEmpty(){
        return size() == 0;
    }

    @Override
    public default boolean contains(Object e){
        return search((T) e);
    }

    @Override
    public default boolean add(T e){
        return insert(e);
    }

    @Override
    public default boolean remove(Object e){
        return delete((T) e);
    }

    @Override
    public default int size(){
        return getSize();
    }

    @Override
    public default boolean containsAll(Collection<?> c){
        return false;
    }

    @Override
    public default boolean addAll(Collection<? extends T> c){
        return false;
    }

    @Override
    public default boolean removeAll(Collection<?> c){
        return false;
    }

    @Override
    public default boolean retainAll(Collection<?> c){
        return false;
    }

    @Override
    public default Object[] toArray(){
        return null;
    }

    @Override
    public default <T> T[] toArray(T[] array){
        return null;
    }
}

class BST<T extends Comparable<T>> implements Tree<T>{

    protected TreeNode<T> root;
    protected int size = 0;

    public BST(){}
    public BST(T[] objects){
        for(T o: objects){
            add(o);
        }
    }

    @Override
    public boolean search(T e) {
        TreeNode<T> current = root;

        while (current != null){
            if(e.compareTo(current.element) < 0){
                current = current.left;
            }
            else if(e.compareTo(current.element) > 0){
                current = current.right;
            }
            else{
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean insert(T e) {
        if(root == null){
            root = createNewNode(e);
        }else{
            TreeNode<T> parent = null;
            TreeNode<T> current = root;
            while (current != null){
                if(e.compareTo(current.element) < 0){
                    parent = current;
                    current = current.left;
                }
                else if(e.compareTo(current.element) > 0){
                    parent = current;
                    current = current.right;
                }
                else{
                    return false;
                }
            }
            if(e.compareTo(parent.element) < 0){
                parent.left = createNewNode(e);
            }else{
                parent.right = createNewNode(e);
            }
        }
        size++;
        return true;
    }

    protected TreeNode<T> createNewNode(T e){
        return new TreeNode<>(e);
    }

    @Override
    public void inorder(){
        inorder(root);
    }

    protected void inorder(TreeNode<T> root){
        if(root == null){
            return;
        }
        inorder(root.left);
        System.out.print(root.element+" ");
        inorder(root.right);
    }

    @Override
    public void postorder(){
        postorder(root);
    }

    protected void postorder(TreeNode<T> root){
        if(root == null){
            return;
        }
        postorder(root.left);
        postorder(root.right);
        System.out.print(root.element+" ");
    }

    @Override
    public void preorder(){
        preorder(root);
    }

    protected void preorder(TreeNode<T> root){
        if(root == null){
            return;
        }
        System.out.print(root.element+" ");
        preorder(root.left);
        preorder(root.right);
    }

    @Override
    public boolean delete(T e) {
        TreeNode<T> parent = null;
        TreeNode<T> current = root;
        while(current != null){
            if(e.compareTo(current.element) < 0){
                parent = current;
                current = current.left;
            }
            else if(e.compareTo(current.element) > 0){
                parent = current;
                current = current.right;
            }
            else{
                break;
            }
        }

        if(current == null){
            return false;
        }
        if(current.left == null){
            if(parent == null){
                root = current.right;
            }
            else{
                if(e.compareTo(parent.element) < 0){
                    parent.left = current.right;
                }
                else{
                    parent.right = current.right;
                }
            }
        }
        else{
            TreeNode<T> parentOfRightMost = current;
            TreeNode<T> rightMost = current.left;

            while(rightMost.right != null){
                parentOfRightMost = rightMost;
                rightMost = rightMost.right;
            }
            current.element = rightMost.element;
            if(parentOfRightMost.right == rightMost){
                parentOfRightMost.right = rightMost.left;
            }else{
                parentOfRightMost.left = rightMost.left;
            }
        }
        size--;
        return true;
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public Iterator<T> iterator() {
        return null;
    }

    private class InorderIterator implements Iterator<T>{

        private ArrayList<T> list = new ArrayList<>();
        private int current = 0;

        public InorderIterator(){
            inorder();
        }

        private void inorder(){
            inorder(root);
        }

        private void inorder(TreeNode<T> root){
            if(root == null)
                return;
            inorder(root.left);
            list.add(root.element);
            inorder(root.right);
        }

        @Override
        public boolean hasNext(){
            return current < list.size();
        }

        @Override
        public T next(){
            return list.get(current++);
        }
    }

    @Override
    public void clear() {
        root = null;
        size = 0;
    }

    public static class TreeNode<T>{
        protected T element;
        protected TreeNode<T> left;
        protected TreeNode<T> right;

        public TreeNode(T e){
            element = e;
        }
    }

    //exercise 25.1
    public void breadthFirstTraversal(){
        ArrayList<TreeNode<T>> list = new ArrayList<>();
        if(root == null)
            return;
        list.add(root);
        while(!list.isEmpty()){
            TreeNode<T> current = list.remove(0);
            System.out.print(current.element+" ");
            if(current.left != null)
                list.add(current.left);
            if(current.right != null)
                list.add(current.right);
        }
    }

    public int height(){
        return height(root);
    }

    private int height(TreeNode<T> root){
        if(root == null)
            return 0;
        else{
            if(height(root.left) > height(root.right)){
                return height(root.left) + 1;
            }
            else{
                return height(root.right) + 1;
            }
        }
    }

    //exercise 25.2
    public boolean isPerfectBST(){
        return size == (int)(Math.pow(2,height())-1);
    }
}

25.3

public class book {


    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        BST<Integer> test = new BST<>();
        System.out.println("Enter 10 integers:");
        for(int i=0;i<10;i++){
            int tmp = input.nextInt();
            test.add(tmp);
        }
        test.inorderUsingStack();
    }
}

//exercise 25.3
    public void inorderUsingStack(){
        inorderUsingStack(root);
    }

    private void inorderUsingStack(TreeNode<T> root){
        if(root == null)
            return;
        Stack<TreeNode<T>> stack = new Stack<>();
        TreeNode<T> current = root;
        while(current != null || !stack.isEmpty()){
            if(current != null){
                stack.push(current);
                current = current.left;
            }
            else{
                current = stack.pop();
                System.out.print(current.element+" ");
                current = current.right;
            }
        }
    }

25.4

public class book {


    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        BST<Integer> test = new BST<>();
        System.out.println("Enter 10 integers:");
        for(int i=0;i<10;i++){
            int tmp = input.nextInt();
            test.add(tmp);
        }
        test.preorderUsingStack();
    }
}

//exercise 25.4
    public void preorderUsingStack(){
        preorderUsingStack(root);
    }

    private void preorderUsingStack(TreeNode<T> root){
        if(root == null)
            return;
        Stack<TreeNode<T>> stack = new Stack<>();
        stack.push(root);

        while (!stack.isEmpty()){
            TreeNode<T> current = stack.pop();
            System.out.print(current.element+" ");

            if(current.right != null){
                stack.push(current.right);
            }
            if(current.left != null){
                stack.push(current.left);
            }
        }
    }

25.5

public class book {


    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        BST<Integer> test = new BST<>();
        System.out.println("Enter 10 integers:");
        for(int i=0;i<10;i++){
            int tmp = input.nextInt();
            test.add(tmp);
        }
        test.postorderUsingStack();
    }
}

public void postorderUsingStack(){
        postorderUsingStack(root);
    }

    private void postorderUsingStack(TreeNode<T> root){
        if(root == null)
            return;

        Stack<TreeNode<T>> stack = new Stack<>();

        TreeNode<T> current = root;
        TreeNode<T> pre = null;

        while(current != null){
            stack.push(current);
            current = current.left;
        }
        while(!stack.empty()){
            current = stack.pop();
            if(current.right != null && current.right != pre){
                stack.push(current);
                current = current.right;
                while (current != null){
                    stack.push(current);
                    current = current.left;
                }
            }
            else{
                System.out.print(current.element+" ");
                pre = current;
            }
        }
    }

25.6

//exercise 25.6
    public int getNumberOfLeaves(){
        return getNumberOfLeaves(root);
    }
    
    private int getNumberOfLeaves(TreeNode<T> root){
        if(root.left == null && root.right == null){
            return 1;
        }else if(root.left == null){
            return getNumberOfLeaves(root.right);
        }else if(root.right == null){
            return getNumberOfLeaves(root.left);
        }else{
            return getNumberOfLeaves(root.left) + getNumberOfLeaves(root.right);
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章