剑指offer笔记(二) 1.3.5 先根遍历,中根遍历,后根遍历 二叉树并且 循环+递归两种方式 1.3.6 用两个栈实现队列的add与remove(“添加”与“读取队列头,并删除”的两个功能 1.3.6 实现快速排序 1.3.7 归并排序 1.3.8 利用二进制位运算 1.3.9 实现函数double doublePower(double base, int expoent) 求base的expoent次方, 不用函数库,不考虑大数问题. 1.3.10 打印1到最大的n位数(大数) 1.3.11 知道链表头和链表中的一个节点,用O(1)的复杂度将这个节点从链表中删除。 1.3.12 交换数组中的奇数,偶数,将偶数排在前面,奇数排在后面。(程序代码可复用) 1.3.13 翻转链表 1.3.14 合并两个链表 1.3.15 判断一个二叉树是否是另一个二叉树的子树 1.3.16 镜像二叉树 1.3.17 顺时针打印数组

package Chapter2;

import Chapter1.Node;
import Chapter1.TheKNumInLast;

public class PrintListFromEnd {
    public static void printListFromEnd(Node list){
        if(list == null){
            return;
        }
        printListFromEnd(list.next);
        System.out.println(list.getValue());
    }
    public static void main(String[] args) {
        Node list = TheKNumInLast.createList(20);
        printListFromEnd(list);
    }

}

1.3.5 先根遍历,中根遍历,后根遍历 二叉树并且 循环+递归两种方式

//二叉树节点class
public class BinaryTreeNode {
    private int value;
    public BinaryTreeNode leftNode;
    public BinaryTreeNode rightNode;
    
    public void setValue(int v){
        this.value = v;
    }
    public int getValue(){
        return this.value;
    }

}

//创建二叉树
public class BinaryTree {
    public static BinaryTreeNode treeRoot;
    static{
        treeRoot = new BinaryTreeNode();
        treeRoot.setValue(1);
        
        treeRoot.leftNode = new BinaryTreeNode();
        treeRoot.leftNode.setValue(2);
        
        treeRoot.rightNode = new BinaryTreeNode();
        treeRoot.rightNode.setValue(3);
        
        treeRoot.leftNode.leftNode = new BinaryTreeNode();
        treeRoot.leftNode.leftNode.setValue(4);
        treeRoot.leftNode.rightNode = new BinaryTreeNode();
        treeRoot.leftNode.rightNode.setValue(5);
        
        treeRoot.rightNode.leftNode = new BinaryTreeNode();
        treeRoot.rightNode.leftNode.setValue(6);
        treeRoot.rightNode.rightNode = new BinaryTreeNode();
        treeRoot.rightNode.rightNode.setValue(7);
    }
}

//创建带访问次数控制code的节点包装类
//此类为 后根遍历 循环方法提供帮助, 与别的遍历方法无关 
package Chapter2;

public class BinaryTreeNodeCode{
    private BinaryTreeNode binaryTreeNode;
    private int code;
    
    public BinaryTreeNodeCode( BinaryTreeNode binaryTreeNode,int code){
        this.binaryTreeNode = binaryTreeNode;
        this.code = code;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public BinaryTreeNode getBinaryTreeNode() {
        return binaryTreeNode;
    }
    
    
}


//开始进行遍历操作
import java.util.ArrayList;
import java.util.LinkedList;

public class BinaryTreeOprate {
    public static void printTreeFirstRoot(BinaryTreeNode treeRoot){
        if(treeRoot == null){
            return;
        }
        System.out.println(treeRoot.getValue());
        printTreeFirstRoot(treeRoot.leftNode);
        printTreeFirstRoot(treeRoot.rightNode);
    }
    public static void printTreeSecoundRoot(BinaryTreeNode treeRoot){
        if(treeRoot == null){
            return;
        }
        printTreeSecoundRoot(treeRoot.leftNode);
        System.out.println(treeRoot.getValue());
        printTreeSecoundRoot(treeRoot.rightNode);
    }
    public static void printTreeThiredRoot(BinaryTreeNode treeRoot){
        if(treeRoot == null){
            return;
        }
        printTreeThiredRoot(treeRoot.leftNode);
        printTreeThiredRoot(treeRoot.rightNode);
        System.out.println(treeRoot.getValue());
    }
    public static void printTreeFirstRootFor(BinaryTreeNode treeRoot){
        if(treeRoot == null){
            return;
        }
        LinkedList<BinaryTreeNode> treeNodeStack = new LinkedList<>();
        treeNodeStack.push(treeRoot);
        while(!treeNodeStack.isEmpty()){
            BinaryTreeNode treeNode = treeNodeStack.getLast();
            treeNodeStack.removeLast();
            System.out.println(treeNode.getValue());
            if(treeNode.rightNode != null){
                treeNodeStack.addLast(treeNode.rightNode);
            }
            if(treeNode.leftNode != null){
                treeNodeStack.addLast(treeNode.leftNode);
            }
            
            
        }
    }
    public static void printTreeSecoundRootFor(BinaryTreeNode treeRoot){
        if(treeRoot == null){
            return;
        }
        LinkedList<BinaryTreeNode> treeNodeStack = new LinkedList<>();
        treeNodeStack.addLast(treeRoot);
        while(!treeNodeStack.isEmpty()){
            if(treeNodeStack.getLast().leftNode != null){
                treeNodeStack.addLast(treeNodeStack.getLast().leftNode);
            }else{
                BinaryTreeNode treeNode = treeNodeStack.getLast();
                System.out.println(treeNode.getValue());
                if(treeNode.rightNode != null){
                    treeNodeStack.addLast(treeNode.rightNode);
                }
            }
            
        }
    }
    /*
     * 规定访问一个节点 所做事情代表的 号码
     * 1 入栈(入栈之后,此节点代码为 1
     * 2 访问左右子节点(如果代码是1, 则下一步进行 访问左右子节点,刷代码为2)
     * 3 弹出并且输出 (如果代码是2 则下一步该进行弹出栈,并且输出值)
     */
    public static void printTreeThiredRootFor(BinaryTreeNode treeRoot) throws Exception{
        if(treeRoot == null){
            return;
        }
        LinkedList<BinaryTreeNodeCode> treeNodeStack = new LinkedList<>();
        treeNodeStack.addLast(new BinaryTreeNodeCode(treeRoot, 1));
        while(!treeNodeStack.isEmpty()){
            //如果栈顶元素的code == 1
            //把栈顶元素的code set成2
            //把栈顶元素的right节点入栈(!=null的话)并设置code=1
            //把栈顶元素的left节点入栈 (!=null的话)并设计code=1
            
            if(treeNodeStack.getLast().getCode() == 1){
                //获取栈顶的元素
                BinaryTreeNodeCode treeNodeCode = treeNodeStack.getLast();
                //因为这是第二次访问,所以置为2
                treeNodeCode.setCode(2);
                //将栈顶的元素左右子树入栈,并且设置code=1
                if(treeNodeCode.getBinaryTreeNode().rightNode != null){
                    treeNodeStack.addLast(new BinaryTreeNodeCode(treeNodeCode.getBinaryTreeNode().rightNode, 1));
                }
                if(treeNodeCode.getBinaryTreeNode().leftNode != null){
                    treeNodeStack.addLast(new BinaryTreeNodeCode(treeNodeCode.getBinaryTreeNode().leftNode, 1));
                }
                
            //如果code == 2
            //则将栈顶元素的值输出并且弹出
            }else if(treeNodeStack.getLast().getCode() == 2){
                System.out.println(treeNodeStack.getLast().getBinaryTreeNode().getValue());
                treeNodeStack.removeLast();
            }else{
                throw new Exception("出现code != 1  && != 2");
            }
            
        }
    }
    public static void main(String[] args) throws Exception {
        BinaryTreeNode treeRoot = BinaryTree.treeRoot;
        System.out.println("======先根遍历===递归=====");
        printTreeFirstRoot(treeRoot);
        System.out.println("======先根遍历===循环=====");
        printTreeFirstRootFor(treeRoot);
        System.out.println("======中根遍历===递归=====");
        printTreeSecoundRoot(treeRoot);
        System.out.println("======中根遍历===循环=====");
        printTreeSecoundRoot(treeRoot);
        System.out.println("======后根遍历===递归=====");
        printTreeThiredRoot(treeRoot);
        System.out.println("======后根遍历===循环=====");
        printTreeThiredRootFor(treeRoot);
    }
}

/////////运行结果////////////////
/*
======先根遍历===递归=====
1
2
4
5
3
6
7
======先根遍历===循环=====
1
2
4
5
3
6
7
======中根遍历===递归=====
4
2
5
1
6
3
7
======中根遍历===循环=====
4
2
5
1
6
3
7
======后根遍历===递归=====
4
5
2
6
7
3
1
======后根遍历===循环=====
4
5
2
6
7
3
1

*/

1.3.6 用两个栈实现队列的add与remove(“添加”与“读取队列头,并删除”的两个功能

package Chapter2;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class QueueAndStack {
    private static Stack<Integer> stack1 = new Stack<>();
    private static Stack<Integer> stack2 = new Stack<>();
    private static LinkedList<Integer> queue1 = new LinkedList<>();
    private static LinkedList<Integer> queue2 = new LinkedList<>();
    
    /*
     * 将两个stack实现成一个queue
     */
    //stack1 用来print
    //stack2 用来add
    //每次print完毕都要将数据从stack1转移到stack2中
    public static void addQueueByStack(int num){
        stack2.push(num);
    }
    public static int removeQueueByStack() throws Exception{
        if(stack2.isEmpty()){
            throw new Exception("the stack is empty !");
        }else{
            //将stack1 清空并且将stack2中的数据转移到stack1中
            stack1.clear();
            while(!stack2.isEmpty()){
                stack1.push(stack2.pop());
            }
            int top = stack1.pop();
            //清空stack2并且将stack1中剩余的数据转移到stack2中
            stack2.clear();
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
            return top;
        }
    }
    
    /*
     * 用两个queue实现一个stack
     * queue1 
     * queue2
     * 当push数据的时候,queue1将数据全部按照队列的方式转移到queue2,
     * 然后将数据加入queue1
     * 然后将数据按照队列的方式从queue2转移回queue1
     * 
     * 当pop的时候,直接读取queue1队列即可
     */
    public static void pushStackByQueue(int num){
        queue2.clear();
        while(!queue1.isEmpty()){
            queue2.addLast(queue1.removeFirst());
        }
        queue1.addLast(num);
        while(!queue2.isEmpty()){
            queue1.addLast(queue2.removeFirst());
        }
        queue2.clear();
    }
    public static int popStackByQueue() throws Exception{
        if(queue1.isEmpty()){
            throw new Exception("this stack is empty !");
        }else{
            return queue1.removeFirst();
        }
    }
    public static void main(String[] args) throws Exception {
        System.out.println("====下面是队列的输出=====");
        addQueueByStack(1);
        addQueueByStack(2);
        addQueueByStack(3);
        addQueueByStack(4);
        addQueueByStack(5);
        System.out.println(removeQueueByStack());
        System.out.println(removeQueueByStack());
        System.out.println(removeQueueByStack());
        System.out.println(removeQueueByStack());
        System.out.println(removeQueueByStack());
        
        System.out.println("====下面是栈的输出======");
        pushStackByQueue(1);
        pushStackByQueue(2);
        pushStackByQueue(3);
        pushStackByQueue(4);
        pushStackByQueue(5);
        System.out.println(popStackByQueue());
        System.out.println(popStackByQueue());
        System.out.println(popStackByQueue());
        System.out.println(popStackByQueue());
        System.out.println(popStackByQueue());
        System.out.println(popStackByQueue());
    }
}

/////////======下面是输出========
/*
====下面是队列的输出=====
1
2
3
4
5
====下面是栈的输出======
5
4
3
2
1
Exception in thread "main" java.lang.Exception: this stack is empty !
    at Chapter2.QueueAndStack.popStackByQueue(QueueAndStack.java:64)
    at Chapter2.QueueAndStack.main(QueueAndStack.java:93)

*/

1.3.6 实现快速排序


import java.util.Arrays;

public class QuickSort {
    public static void swap(int[] arr, int i, int j){
        int k = arr[i];
        arr[i] = arr[j];
        arr[j] = k;
    }
    public static void sort(int[] arr,int start, int end){
        if(start >= end){
            return;
        }
        int key = arr[start];
        int i = start+1;
        int j = end;
        for(;i<j;){
            if(arr[i] < key && arr[j] >= key){
                i++;
            }else if(arr[i] >= key && arr[j] >= key){
                j--;
            }else if(arr[i] < key && arr[j] < key){
                i++;
            }else if(arr[i] >= key && arr[j] < key){
                swap(arr,i,j);
                j--;
            }
        }
        if(arr[i] >= key){
            i--;
            swap(arr,start,i);
        }else{
            swap(arr,start,i);
        }
        sort(arr,start,i-1);
        sort(arr,i+1,end);
        
    }
    public static void main(String[] args) {
        int[] a = {4,1,2,7,4,3,9,0,2};
        sort(a, 0, a.length-1);
        System.out.println(Arrays.toString(a));
    }

}

插入排序思想:每一次都将key插入到已经排序好的序列
初始:5 4 8 1 6 9 7
第一:5 4 9 1 6 9 7(key = 5)经过第一轮,5已经是排序好的序列了,key = 4
第二:4 5 9 1 6 9 7(key = 2)经过第二轮,4 5已经排序好了,key = 9
…….以此类推

选择排序思想:每次都选择最小的数放在最前面
初始:5 4 8 1 6 9 7
第一:1 5 4 8 6 9 7 选择1 并且把1放在最前面,然后看 5 4 8 6 9 7 这个序列,再选择最小的放在前面。
第二:1 4 5 8 6 9 7
…….以此类推

1.3.7 归并排序

package Chapter2;

import java.util.Arrays;

public class MergeSort {
    public static void sort(int[] arr, int start, int end){
        if(start >= end){
            return;
        }
        int q = (start+end)/2;
        sort(arr,start,q);
        sort(arr,q+1,end);
        merge(arr, start, q, end);
    }
    public static void merge(int[] arr, int start, int q, int end){
        int[] temp = new int[end-start+1];
        int i = start;
        int j = q+1;
        for(;i<=q && j<=end;){
            if(arr[i] <= arr[j]){
                temp[i-start+(j-(q+1))] = arr[i];
                i++;
            }
            if(arr[i] > arr[j]){
                temp[i-start+(j-(q+1))] = arr[j];
                j++;
            }
        }
        while(i <= q){
            temp[i-start+(j-(q+1))] = arr[i];
            i++;
        }
        while(j <= end){
            temp[i-start+(j-(q+1))] = arr[j];
            j++;
        }
        for(int k = start; k <= end; k++){
            arr[k] = temp[k-start];
        }
    }
    public static void main(String[] args) {
        int[] a = {5,4,5,8,6,4,1,3,9,7};
        sort(a, 0, a.length-1);
        System.out.println(Arrays.toString(a));
    }

}

1.3.8 利用二进制位运算

(1)统计 一个数的二进制里有多少个 1 **
**(2)统计 两个十进制数的二进制位有多少位不一样

package Chapter2;

public class Sum1 {
    //设置一个判断数,一直向左移位
    public static int sumOf1First(int num){
        int count = 0;
        int flag = 1;
        while(flag != 0){
            if((num & flag) != 0)
                count ++;
            flag = flag << 1;
        }
        return count;
    }
    //num & (num-1) 可以去掉num最右面的1
    public static int sumOf1Secound(int num){
        int count = 0;
        while(num != 0){
            count++;
            num = num & (num-1);
        }
        return count;
    }
    //判断两个数的二进制有几位不一样
    public static int sumDiffPos(int num1, int num2){
        int num = num1 ^ num2;
        return sumOf1Secound(num);
    }
    public static void main(String[] args) {
        System.out.println(sumOf1First(9));
        System.out.println(sumOf1Secound(9));
        System.out.println(sumDiffPos(9, 8));
    }

}
////////======输出=========
/*
2
2
1
*/

1.3.9 实现函数double doublePower(double base, int expoent) 求base的expoent次方, 不用函数库,不考虑大数问题.

package Chapter2;

public class DoublePow {
    public static double doublePower(double base, int expoent) throws Exception{
        if(base == 0.0){
            if(expoent < 0){
                throw new Exception("the base and the expoent can't all < 0");
            }else{
                return 1;
            }
        }
        if(expoent == 0){
            return 1;
        }
        double result = 1.0;
        if(expoent < 0){
//          result = doublePowerPositive(base, -expoent);
            result = doublePowerPositiveREC(base, expoent);
            result = 1/result;
        }else{
            result = doublePowerPositiveREC(base, expoent);
//          result = doublePowerPositive(base, expoent);
        }
        return result;
    }
    //第一个算子
    //仅仅是用循环进行乘积运算,效率不高
    private static double doublePowerPositive(double base, double expoent){
        double result = 1.0;
        for(int i = 0; i < expoent; i++){
            result *= base;
        }
        return result;
    }
    //第二个算子
    //用方程 a(n) = a(n/2)*a(n/2) n是偶数
    //     a(n) = a((n-1)/2)*a((n-1)/2)*a n是奇数
    public static double doublePowerPositiveREC(double base, int expoent){
        if(expoent == 1){
            return base;
        }
        if(expoent == 0){
            return 1;
        }
        double result = doublePowerPositiveREC(base, expoent/2);
        result *= result;
        if((expoent & 1) == 1){
             result *= base;
        }
        return result;
    }
    public static void main(String[] args) {
        try {
            System.out.println(doublePower(3.0, 2));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1.3.10 打印1到最大的n位数(大数)

package Chapter2;

import java.util.Arrays;

public class PrintOneToMaxNumOfN {
    public static void printOneToMaxN(int n){
        int[] number = new int[n+1];
        for(int i = 0; i <= n; i++){
            number[i] = 0;
        }
        while(!increase(number)){
            printBigNum(number);
        }
    }
    private static boolean increase(int[] number) {
        boolean overflow = false;
        int nSum = 0;
        int carry = 0;
        
        for(int i = number.length-1; i >=0; i--){
            nSum = number[i]+carry;
            if(i == (number.length-1)){
                nSum++;
            }
            if(nSum >= 10){
                carry = 1;
                nSum -= 10;
            }else{
                carry = 0;
            }
            number[i] = nSum;
        }
        if(number[0] > 0){
            overflow = true;
        }
        return overflow;
    }
    private static void printBigNum(int[] number) {
        boolean flag = false;
        for(int i = 1; i < number.length; i++){
            if(number[i] != 0)
                flag = true;
            if(flag)
                System.out.print(number[i]);
        }
        System.out.println();
    }
    public static void main(String[] args) {
        printOneToMaxN(2);
    }

}
/////====运行结果=====
/*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.....
*/

1.3.11 知道链表头和链表中的一个节点,用O(1)的复杂度将这个节点从链表中删除。

package Chapter3;

import Chapter1.Node;
import Chapter1.TheKNumInLast;

public class DeleteANode {
    public static void deleteANode(Node root, Node node){
        if(root==null || node==null)
            return;
        if(node == root){
            root = null;
            node = null;
            return;
        }
        if(node.next == null){
            Node nowNode = root;
            while(nowNode!=null){
                if(nowNode.next == node){
                    nowNode.next = null;
                }
                nowNode = nowNode.next;
            }
            return;
        }
        Node nextNode = node.next;
        node.setValue(nextNode.getValue());
        node.next = nextNode.next;
        nextNode = null;
    }
    public static void main(String[] args) {
        Node nodeList = TheKNumInLast.createList(10);
        Node aNode = null;
        Node head = nodeList;
        while(head != null){
            if(head.getValue() == 6){
                aNode = head.next;
            }
            head = head.next;
        }
        deleteANode(nodeList, aNode);
        TheKNumInLast.printList(nodeList);
    }
}

//=======输出========
/*
1
2
3
4
5
6
8
9
10

*/

1.3.12 交换数组中的奇数,偶数,将偶数排在前面,奇数排在后面。(程序代码可复用)

package Chapter3;

import java.util.Arrays;

interface SwapFactor<T>{
    public boolean isSwap(T t);
}
class ParitySwap implements SwapFactor<Integer>{
    public boolean isSwap(Integer num){
        if(((int)num & 1) == 0){
            return true;
        }
        return false;
    }
    
}
public class SwapArray<T>{
    private SwapFactor swapFactor = null;
    private T[] arr;
    public SwapArray(SwapFactor swapFactor, T[] arr){
        this.swapFactor = swapFactor;
        this.arr = arr;
    }
    public void swapArray() throws Exception{
        if(arr == null)
            throw new Exception("the array is empty");
        int i = 0;
        int j = arr.length-1;
        while(i < j){
            if(swapFactor.isSwap(arr[i]) && swapFactor.isSwap(arr[j])){
                i++;
            }else if(!swapFactor.isSwap(arr[i]) &&!swapFactor.isSwap(arr[j])){
                j--;
            }else if(swapFactor.isSwap(arr[i]) && !swapFactor.isSwap(arr[j])){
                i++;
            }else{
                T temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
                i++;
            }
            
        }
    }
    private void swap(T a, T b){
        T temp = a;
        a = b;
        b = temp;
    }
    public static void main(String[] args) {
        Integer[] arr = {1,2,3,4,5,6,7,8,9};
        SwapFactor swapFactor = new ParitySwap();
        SwapArray<Integer> swapArray = new SwapArray<>(swapFactor, arr);
        try {
            swapArray.swapArray();
        } catch (Exception e) {
            e.printStackTrace();
        }
        for(int each: arr){
            System.out.print(each+" ");
        }
        System.out.println();
    }

}

1.3.13 翻转链表

package Chapter3;

import Chapter1.Node;
import Chapter1.TheKNumInLast;

public class ReverseList {
    public static Node reverseList(Node root) throws Exception{
        Node reverseHead = null;
        Node nowNode = root;
        Node prevNode = null;
        while(nowNode != null){
            Node nextNode = nowNode.next;
            if(nextNode == null)
                reverseHead = nowNode;
            nowNode.next = prevNode;
            
            prevNode = nowNode;
            nowNode = nextNode;
        }
        return reverseHead;
        
    }
    public static void main(String[] args) {
        Node list = TheKNumInLast.createList(10);
        try {
            Node reserveList = reverseList(list);
            TheKNumInLast.printList(reserveList);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1.3.14 合并两个链表

package Chapter3;

import Chapter1.Node;
import Chapter1.TheKNumInLast;

public class MergeTwoList {

    public static Node mergeTwoList(Node root1, Node root2){
        Node head = null;
        if(root1 == null && root2 == null)
            return null;
        if(root1 == null )
            return root2;
        if(root2 == null)
            return root1;
        if(root1.getValue() > root2.getValue()){
            head = root2;
            head.next = mergeTwoList(root1, root2.next);
        }else{
            head = root1;
            head.next = mergeTwoList(root1.next, root2);
        }
        return head;
    }
    public static void main(String[] args) {
        Node root1 = TheKNumInLast.createList(10);
        Node root2 = TheKNumInLast.createList(10);
        Node root = mergeTwoList(root1, root2);
        TheKNumInLast.printList(root);
    }

}

1.3.15 判断一个二叉树是否是另一个二叉树的子树

package Chapter3;

import Chapter1.Node;
import Chapter2.BinaryTreeNode;

public class ChildOfBinaryTree {
    
    public static boolean isChildOfBinaryTree(BinaryTreeNode childRoot, BinaryTreeNode fatherRoot){
        boolean result = false;
        if(childRoot != null && fatherRoot != null){
            if(childRoot.getValue() == fatherRoot.getValue())
                result = isChildRootOfFatherRoot(childRoot, fatherRoot);
            if(!result)
                result = isChildOfBinaryTree(childRoot, fatherRoot.leftNode);
            if(!result)
                result = isChildOfBinaryTree(childRoot, fatherRoot.rightNode);
        }
        return result;
    }
    private static boolean isChildRootOfFatherRoot(BinaryTreeNode childRoot, BinaryTreeNode fatherRoot){
        if(childRoot == null)
            return true;
        if(fatherRoot == null)
            return false;
        if(childRoot.getValue() != fatherRoot.getValue())
            return false;
        return isChildRootOfFatherRoot(childRoot.leftNode, fatherRoot.leftNode) &&
                isChildRootOfFatherRoot(childRoot.rightNode, fatherRoot.rightNode);
    }
    public static void main(String[] args) {
        BinaryTreeNode treeFather = null;
        BinaryTreeNode treeChild = null;
        //父类书初始化
        treeFather = new BinaryTreeNode();
        treeFather.setValue(1);
        
        treeFather.leftNode = new BinaryTreeNode();
        treeFather.leftNode.setValue(2);
        
        treeFather.rightNode = new BinaryTreeNode();
        treeFather.rightNode.setValue(3);
        
        treeFather.leftNode.leftNode = new BinaryTreeNode();
        treeFather.leftNode.leftNode.setValue(4);
        treeFather.leftNode.rightNode = new BinaryTreeNode();
        treeFather.leftNode.rightNode.setValue(5);
        
        treeFather.rightNode.leftNode = new BinaryTreeNode();
        treeFather.rightNode.leftNode.setValue(6);
        treeFather.rightNode.rightNode = new BinaryTreeNode();
        treeFather.rightNode.rightNode.setValue(7);
    
        //子类树初始化
        treeChild = new BinaryTreeNode();
        treeChild.setValue(2);
        
        treeChild.leftNode = new BinaryTreeNode();
        treeChild.leftNode.setValue(4);
        
        treeChild.rightNode = new BinaryTreeNode();
        treeChild.rightNode.setValue(5);
        System.out.println(ChildOfBinaryTree.isChildOfBinaryTree(treeChild, treeFather));
    }

}

1.3.16 镜像二叉树

package Chapter3;

import java.util.function.BinaryOperator;

import Chapter1.TheKNumInLast;
import Chapter2.BinaryTreeNode;
import Chapter2.BinaryTreeOprate;

public class ImageBinaryTree {
    public static void imageTree(BinaryTreeNode root){
        if(root == null)
            return;
        BinaryTreeNode temp = root.leftNode;
        root.leftNode = root.rightNode;
        root.rightNode = temp;
        
        imageTree(root.leftNode);
        imageTree(root.rightNode);
    }
    public static void main(String[] args) {
        BinaryTreeNode treeFather = null;
        //二叉树构建
        treeFather = new BinaryTreeNode();
        treeFather.setValue(1);
        
        treeFather.leftNode = new BinaryTreeNode();
        treeFather.leftNode.setValue(2);
        
        treeFather.rightNode = new BinaryTreeNode();
        treeFather.rightNode.setValue(3);
        
        treeFather.leftNode.leftNode = new BinaryTreeNode();
        treeFather.leftNode.leftNode.setValue(4);
        treeFather.leftNode.rightNode = new BinaryTreeNode();
        treeFather.leftNode.rightNode.setValue(5);
        
        treeFather.rightNode.leftNode = new BinaryTreeNode();
        treeFather.rightNode.leftNode.setValue(6);
        treeFather.rightNode.rightNode = new BinaryTreeNode();
        treeFather.rightNode.rightNode.setValue(7);
    
        imageTree(treeFather);
        BinaryTreeOprate.printTreeFirstRoot(treeFather);
    }
}


//=======输出========
/*
1
3
7
6
2
5
4
*/

1.3.17 顺时针打印数组

package Chapter3;

public class ClockwiseArray {

    public static void printClockwiseArray(int[][] arr){
        if(arr == null)
            return;
        int weight = arr[0].length-1;
        int height = arr.length-1;
        
        int w = weight;
        int h = height;
        
        while(w > (weight/2) && h > (height/2)){
            for(int i = weight-w; i <= w; i++){
                System.out.print(arr[height-h][i]+" ");
            }
            for(int j = (height-h+1); j <= (h-1); j++){
                System.out.print(arr[j][w]+" ");
            }
            for(int i = w; i >= (weight-w); i--){
                System.out.print(arr[h][i]+" ");
            }
            for(int j = (h-1); j >= (height-h+1); j--){
                System.out.print(arr[j][weight-w]+" ");
            }
//          System.out.println("w = "+w);
//          System.out.println("h = "+h);
            w = w-1;
            h = h-1;
        }
        if(weight > height){
            for(int i = (weight-w); i <= (w); i++)
            {
                System.out.print(arr[h][i]+" ");
            }
        }
        if(height >= weight){
            for(int i = (height-h); i <= (h); i++)
            {
                System.out.print(arr[i][w]+" ");
            }
        }
    }
    public static void main(String[] args) {
        int[][] arr = {
                {1,2,3,4,50},
                {5,6,7,8,60},
                {9,10,11,12,70}
        };
        printClockwiseArray(arr);
    }

}

//====输出=====
/*
1 2 3 4 50 60 70 12 11 10 9 5 6 7 8 
*/

博客迁移自 GC-CSDN