版权声明:本文为博主原创文章,未经博主允许不得转载。 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)攻击与防范;