二叉树、链表找节点问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/loongshawn/article/details/84108757

1、二叉树找倒数第N大的节点;
在这里插入图片描述
回顾二叉树创建和查询

public class TreeNode {

    private String value;
    private TreeNode left;
    private TreeNode right;

    public TreeNode(String value, TreeNode left, TreeNode right) {
        this.value = value;
        this.left = left;
        this.right = right;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public TreeNode getLeft() {
        return left;
    }

    public void setLeft(TreeNode left) {
        this.left = left;
    }

    public TreeNode getRight() {
        return right;
    }

    public void setRight(TreeNode right) {
        this.right = right;
    }
}

public class TreeNodeUtil {

    public TreeNode createTreeNodePre(LinkedList<String> linkedList) {

        TreeNode root = null;
        if (linkedList != null && linkedList.size()>0){

            String value = linkedList.removeFirst();
            if (value != null) {
                root = new TreeNode(value, null, null);
                root.setLeft(createTreeNodePre(linkedList));
                root.setRight(createTreeNodePre(linkedList));
            }
        }

        return root;
    }

    public void recursionTreeNodePre(TreeNode root) {

        if (root != null) {
            System.out.print(root.getValue());
            recursionTreeNodePre(root.getLeft());
            recursionTreeNodePre(root.getRight());
        }
    }

    public void recursionTreeNodeMid(TreeNode root) {

        if (root != null) {
            recursionTreeNodeMid(root.getLeft());
            System.out.print(root.getValue());
            recursionTreeNodeMid(root.getRight());
        }
    }

    public void recursionTreeNodeBac(TreeNode root) {

        if (root != null) {
            recursionTreeNodeBac(root.getLeft());
            recursionTreeNodeBac(root.getRight());
            System.out.print(root.getValue());
        }
    }

    public static void main(String[] args){

        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("A");linkedList.add("B");linkedList.add("C");linkedList.add("D");linkedList.add(null);linkedList.add(null);
        linkedList.add("E");linkedList.add(null);linkedList.add(null);linkedList.add("F");linkedList.add(null);linkedList.add(null);
        linkedList.add("G");linkedList.add("H");linkedList.add(null);linkedList.add("I");linkedList.add(null);linkedList.add(null);
        linkedList.add("J");linkedList.add(null);linkedList.add(null);

        TreeNodeUtil treeNodeUtil = new TreeNodeUtil();
        TreeNode root = treeNodeUtil.createTreeNodePre(linkedList);
        treeNodeUtil.recursionTreeNodePre(root);
        System.out.println();
        treeNodeUtil.recursionTreeNodeMid(root);
        System.out.println();
        treeNodeUtil.recursionTreeNodeBac(root);
    }
}

D:\Java\jdk1.8.0_74\bin\java.exe "-javaagent:D:\Intellij Idea\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar=49434:D:\Intellij Idea\IntelliJ IDEA 2018.2.4\bin" -Dfile.encoding=UTF-8 -classpath D:\Java\jdk1.8.0_74\jre\lib\charsets.jar;D:\Java\jdk1.8.0_74\jre\lib\deploy.jar;D:\Java\jdk1.8.0_74\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_74\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_74\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_74\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_74\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_74\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_74\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_74\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_74\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_74\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_74\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_74\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_74\jre\lib\javaws.jar;D:\Java\jdk1.8.0_74\jre\lib\jce.jar;D:\Java\jdk1.8.0_74\jre\lib\jfr.jar;D:\Java\jdk1.8.0_74\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_74\jre\lib\jsse.jar;D:\Java\jdk1.8.0_74\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_74\jre\lib\plugin.jar;D:\Java\jdk1.8.0_74\jre\lib\resources.jar;D:\Java\jdk1.8.0_74\jre\lib\rt.jar;C:\Users\alibaba\IdeaProjects\HelloWorld\out\production\HelloWorld TreeNodeUtil
ABCDEFGHIJ
DCEBFAHIGJ
DECFBIHJGA
Process finished with exit code 0

通过上述方法,优化下,可以遍历整个二叉树,并将节点存储到链表中,在获取到树的所有节点后,再对这个链表进行排序

public void recursionTreeNodeBac(TreeNode root,LinkedList<String> linkedList) {

        if (root != null) {
            recursionTreeNodeBac(root.getLeft(),linkedList);
            recursionTreeNodeBac(root.getRight(),linkedList);
            System.out.print(root.getValue());
            linkedList.add(root.getValue());
        }
    }

示例中使用了LinkedList来存储节点元素,可以将链表转为数组,然后对数组进行降序排序,即可通过下标获取第N大的元素。

数组的排序可以使用冒泡排序。

// 比较数组中相邻两元素大小,将大的元素移到数组的右边(升序)
public Integer[] bubbleSort(Integer[] arr) {

        for (int i=0;i<arr.length;i++) {

            for (int j=0;j<arr.length - i -1;j++) {
                if (arr[j] > arr[j+1]) {
                    int temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return arr;
    }

快速排序

// 快速排序,选定arr[0]作为基准,将小于该值的元素替换到数组左边,大于的值替换到右边,完成一次递归后,进入下一次递归,直到数组长度为2
public Integer[] quickSort(Integer[] arr,int left,int right) {

        if (left < right) {
            int s = arr[left];
            int i = left;
            int j = right + 1;

            while (true) {

                while (i+1<arr.length && arr[++i] <s);
                while (j-1>-1 && arr[--j] >s);

                if (i >= j) {
                    break;
                } else {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }

            arr[left] = arr[j];
            arr[j] = s;
            //对左面进行递归
            quickSort(arr,left,j-1);
            //对右面进行递归
            quickSort(arr,j+1,right);
        }
        return arr;
    }

若是查找树中最大元素,则需要在遍历节点时,定义一个maxValue,每次遍历时将节点值与maxValue比较,取较大者,直到遍历结束。

public int recursionTreeNodeMidMax(TreeNode root) {

        int maxValue = 0;
        if (root != null) {
            //System.out.print(root.getValue());
            maxValue = root.getValue();
            int maxLeft = recursionTreeNodeMidMax(root.getLeft());
            int maxRight = recursionTreeNodeMidMax(root.getRight());
            maxValue = Math.max(Math.max(maxLeft,maxRight),maxValue);
        }
        return maxValue;
    }

2、链表找倒数N个节点;

public int getNode(LinkedNode head,int K) {

        LinkedNode ahead = head;
        LinkedNode behind = null;

        for (int i=0;i<K-1;i++) {
            ahead = ahead.getBehind();
        }

        behind = head;

        while (ahead.getBehind() != null) {
            ahead = ahead.getBehind();
            behind = behind.getBehind();
        }

        return behind.getValue();
    }

3、Http协议;

4、网络安全包(CSRF)攻击与防范;

猜你喜欢

转载自blog.csdn.net/loongshawn/article/details/84108757