java数据结构期末复习_java数据结构复习02

1.递归问题

1.1计算阶乘

packageinterview.recursion;importjava.util.Scanner;public classFact {public static voidmain(String[] args) {

System.out.println("请输入n的值:");

Scanner in= newScanner(System.in);int n =in.nextInt();int num =fact(n);

System.out.println(n+ "的阶乘为:" +num);

}public static int fact(intn) {if (n == 1) {return 1;

}return n * fact(n - 1);

}

}

5a29dbf94cac63c359853b1c77270153.png

1.2计算斐波那契数列

Fibonacci sequence:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ……

packageinterview.recursion;importjava.util.Scanner;public classFib {public static int fib(intn) {if (n == 0) {return 0;

}else if (n == 1) {return 1;

}else{return fib(n - 1) + fib(n - 2);

}

}public static voidmain(String[] args) {

System.out.println("请输入n的值:");

Scanner in= newScanner(System.in);int n =in.nextInt();int num =fib(n);

System.out.println("第" + n + "个值的fib为:" + +num);

}

}

d5a819500beeb2f52da4df4482b67c84.png

1.3计算最大公约数(辗转相除法)

c8a0a10ceea9ece895fa031f48218644.png

d2e3d4d1689dc96e4614665222ba39bd.png

1b0044639ee432a4230e74049744a1f3.png

packageinterview.recursion;importjava.util.Scanner;public classGcd {public static int gcd(int max, intmin) {if (min == 0) {returnmax;

}else{return gcd(min, max %min);

}

}public static voidmain(String[] args) {

System.out.println("请输入max的值:");

Scanner in= newScanner(System.in);int max =in.nextInt();

System.out.println("请输入min的值:");int min =in.nextInt();int num =gcd(max, min);

System.out.println(max+ "和" + min + "的最大公约数为:" +num);

}

}

f1d7b240aab5e817047b7a2743b34e43.png

1.4汉诺塔问题(递归)

问题描述

三个柱子,起初有若干个按大小关系顺序安放的盘子,需要全部移动到另外一个柱子上。移动规则:在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

移动次数: f(n)=2n -1

解法思路

使用递归算法进行处理。

汉诺塔的算法大概有3个步骤:

(1)把a上的n-1个盘通过c移动到b。

(2)把a上的最下面的盘移到c。

(3)因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了。

在网上找到一个3阶的汉诺塔递归过程示意图,参考一下。

02ee580afaaf1224ea7d1e3466de1cc0.png

packagecn.jxufe.ch06_hanoitowers;public classHanoiTowers {/*** 汉诺塔问题:所有的盘子,刚开始都在塔座A上,要求将所有的盘子从塔座A移动到塔座C,每次只能移动一个盘子,且

* 任何盘子不能放在比自己小的盘子上。

*

*@paramtopN:移动的盘子数

*@paramfrom:从哪个塔座开始

*@paraminter:中间塔座

*@paramto;目标塔座*/

public static void doTower(int topN, char from, char inter, charto) {if (topN == 1) {

System.out.println("盘子1,从" + from + "塔座到" + to + "塔座");return;

}else{

doTower(topN- 1, from, to, inter);

System.out.println("盘子" + topN + ",从" + from + "塔座到" + to + "塔座");

doTower(topN- 1, inter, from, to);

}

}

}

packagecn.jxufe.ch06_hanoitowers;public classTestHanoiTowers {public static voidmain(String[] args) {

HanoiTowers.doTower(4,'A','B','C');

}

}

491cb46eacf1737cb57990f041253afa.png

1.5瓶盖问题

packagetest;/** 描述:每 3 个可乐盖可兑换 1 瓶子可乐,求买 n 瓶可乐最终可获得的可乐瓶子数。*/

importjava.util.Scanner;public classT03 {public static int times = 1;public static voidmain(String[] args) {

Scanner input= newScanner(System.in);

System.out.print("输入购买的可乐数:");

times= 1;int j =input.nextInt();int i =func(j);

System.out.println("--------------------------");

System.out.println("总共可获得 " + i + " 瓶\n\n");

}public static int func(inti) {if (i < 3) {

System.out.println("最终剩下 " + i + " 个瓶盖,不足以兑换");returni;

}else{

System.out.println("第 " + times++ + " 次兑换," + "本次兑换总共有 " + i + " 个瓶盖,用 " + (i - i % 3) + " 个瓶盖换了 " + i / 3

+ " 瓶可乐,剩余 " + i % 3 + " 个瓶盖可用于下次兑换");return ((i - i % 3) + func(i / 3 + i % 3));

}

}

}

50152bc4e1168408511b4d7155237db3.png

1.6走楼梯

题目描述:

一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法。

思路:当n大于2的时候,每次可以选择走2级也可以选择走1级,所有都有两种方案。即f(n-1)+f(n-2)

packageinterview.recursion;importjava.util.Scanner;public classStairs {public static int solve(intn) {if (n == 1) {return 1;

}else if (n == 2) {return 2;

}else{return solve(n - 1) + solve(n - 2);

}

}public static voidmain(String[] args) {

System.out.println("请输入n的值:");

Scanner in= newScanner(System.in);int n =in.nextInt();int num =solve(n);

System.out.println("总共有" + num + "种走法");

}

}

0447ca4bdc736498922e6c78e0312082.png

2.二叉树

2.1插入和查找

89d0408b7a96666a837986c67945be0a.png

packagecn.jxufe.ch07_tree;/*** 二叉树节点*/

public classNode {//数据项

public intdata;publicString sdata;publicNode leftChild;publicNode rightChild;public Node(intdata,String sdata) {this.data =data;this.sdata =sdata;

}

}

packagecn.jxufe.ch07_tree;/*** 二叉树*/

public classTree {//根节点

publicNode root;/*** 插入节点*/

public void insert(intvalue,String sdata) {//封装节点

Node newNode = newNode(value,sdata);//引用当前节点

Node current =root;//引用父节点

Node parent;//如果root为null,也就是第一次插入的节点

if (root == null) {

root=newNode;return;

}else{while (true) {//父节点指向当前节点

parent =current;//如果当前节点指向的数据,比插入的要大,则向左走

if (value

current=current.leftChild;if (current == null) {

parent.leftChild=newNode;return;

}

}else{

current=current.rightChild;if (current == null) {

parent.rightChild=newNode;return;

}

}

}

}

}/*** 查找节点*/

public Node find(intvalue) {//引用当前节点,从根节点开始

Node current =root;//只要查找的值,不等于当前节点的值

while (current.data !=value) {//比较查找值,与当前节点值的大小

if (current.data >value) {

current=current.leftChild;

}else{

current=current.rightChild;

}//如果查找不到

if (current == null) {return null;

}

}returncurrent;

}/*** 删除节点*/

public void delete(intvalue) {

}

}

packagecn.jxufe.ch07_tree;public classTestTree {public static voidmain(String[] args) {

Tree tree= newTree();

tree.insert(10, "zhangsan");

tree.insert(20, "lisi");

tree.insert(3, "wangwu");

tree.insert(14, "zhaoliu");

tree.insert(76, "zhouqi");

System.out.println(tree.root.data);

System.out.println(tree.root.leftChild.data);

System.out.println(tree.root.rightChild.data);

System.out.println(tree.root.rightChild.leftChild.data);

System.out.println(tree.root.rightChild.rightChild.data);

Node node= tree.find(20);

System.out.println(node.data+ "," +node.sdata);

System.out.println(node.rightChild.data+ "," +node.rightChild.sdata);

}

}

f1560568683d13145988137c015bc8a1.png

2.2遍历二叉树

6374d68c284c08690d9f1872c49ddb45.png

packagecn.jxufe.ch07_tree;/*** 二叉树节点*/

public classNode {//数据项

public intdata;publicString sdata;publicNode leftChild;publicNode rightChild;public Node(intdata,String sdata) {this.data =data;this.sdata =sdata;

}

}

packagecn.jxufe.ch07_tree;/*** 二叉树*/

public classTree {//根节点

publicNode root;/*** 插入节点*/

public void insert(intvalue, String sdata) {//封装节点

Node newNode = newNode(value, sdata);//引用当前节点

Node current =root;//引用父节点

Node parent;//如果root为null,也就是第一次插入的节点

if (root == null) {

root=newNode;return;

}else{while (true) {//父节点指向当前节点

parent =current;//如果当前节点指向的数据,比插入的要大,则向左走

if (value

current=current.leftChild;if (current == null) {

parent.leftChild=newNode;return;

}

}else{

current=current.rightChild;if (current == null) {

parent.rightChild=newNode;return;

}

}

}

}

}/*** 查找节点*/

public Node find(intvalue) {//引用当前节点,从根节点开始

Node current =root;//只要查找的值,不等于当前节点的值

while (current.data !=value) {//比较查找值,与当前节点值的大小

if (current.data >value) {

current=current.leftChild;

}else{

current=current.rightChild;

}//如果查找不到

if (current == null) {return null;

}

}returncurrent;

}/*** 删除节点*/

public void delete(intvalue) {

}/*** 前序遍历*/

public voidfrontOrder(Node localNode) {if (localNode != null) {//访问根节点

System.out.print(localNode.data + ":" + localNode.sdata + " ");//前序遍历左子树

frontOrder(localNode.leftChild);//前序遍历右子树

frontOrder(localNode.rightChild);

}

}/*** 中序遍历*/

public voidinOrder(Node localNode) {if (localNode != null) {//中序遍历左子树

inOrder(localNode.leftChild);//访问根节点

System.out.print(localNode.data + "," + localNode.sdata + " ");//中序遍历右子树

inOrder(localNode.rightChild);

}

}/*** 后序遍历*/

public voidafterOrder(Node localNode) {if (localNode != null) {//后序遍历左子树

afterOrder(localNode.leftChild);//后序遍历右子树

afterOrder(localNode.rightChild);//访问根节点

System.out.print(localNode.data + "," + localNode.sdata + " ");

}

}

}

packagecn.jxufe.ch07_tree;public classTestTree {public static voidmain(String[] args) {

Tree tree= newTree();

tree.insert(10, "zhangsan");

tree.insert(20, "lisi");

tree.insert(3, "wangwu");

tree.insert(14, "zhaoliu");

tree.insert(76, "zhouqi");

tree.insert(13, "zhuba");

System.out.println("前序遍历:");

tree.frontOrder(tree.root);

System.out.println();

System.out.println("中序遍历:");

tree.inOrder(tree.root);

System.out.println();

System.out.println("后序遍历:");

tree.afterOrder(tree.root);

}

}

eb97714454c2770b01246919094e114b.png

2.3删除二叉树节点

034bec1b1f7f23f5bd571689724ea34c.png

packageinterview;public classTree {privateNode root;public void insertNode(intdata, String sdata) {

Node newNode= newNode(data, sdata);//引用当前节点

Node current =root;

Node parent;//如果root为null,也就是第一次插入

if (root == null) {

root=newNode;

}else{while (true) {

parent=current;//如果当前节点指向的数据,比插入的节点数据要大,则向左走

if (data

current=current.leftChildNode;if (current == null) {

parent.leftChildNode=newNode;return;

}

}else{

current=current.rightChildNode;if (current == null) {

parent.rightChildNode=newNode;return;

}

}

}

}

}public Node findNode(intvalue) {

Node current=root;while (current.data !=value) {if (current.data >value) {

current=current.leftChildNode;

}else{

current=current.rightChildNode;

}if (current == null) {return null;

}

}returncurrent;

}public voidfontOrder(Node root) {if (root != null) {

System.out.println(root.data);

fontOrder(root.leftChildNode);

fontOrder(root.rightChildNode);

}

}publicNode getSuccessor(Node delNode) {

Node successor=delNode;

Node successorParent=delNode;

Node current=delNode.rightChildNode;while (current != null) {

successorParent=successor;

successor=current;

current=current.leftChildNode;

}if(successor !=delNode.rightChildNode) {

successorParent.leftChildNode=successor.rightChildNode;

successor.rightChildNode=delNode.rightChildNode;

}returnsuccessor;

}public boolean deleteNode(intvalue) {//引用当前节点为根节点

Node current =root;//引用当前节点的父节点

Node parent =root;//是否为左子树

boolean isLeftchild = true;//查找

while (current.data !=value) {

parent=current;//比较

if (current.data >value) {

current=current.leftChildNode;

isLeftchild= true;

}else{

current=current.rightChildNode;

isLeftchild= false;

}if (current == null) {return false;

}

}//删除

if (current.leftChildNode == null && current.rightChildNode == null) {//1. 删除的节点为叶子节点

if (current ==root) {

root= null;

}else if (isLeftchild) {//如果它是父节点的左子节点

parent.leftChildNode = null;

}else{

parent.rightChildNode= null;

}

}else if (current.rightChildNode == null) { //2. 该节点有一个子节点,且为左子节点

if (current ==root) {

root=current.leftChildNode;

}else if(isLeftchild) {

parent.leftChildNode=current.leftChildNode;

}else{

parent.rightChildNode=current.leftChildNode;

}

}else if (current.leftChildNode == null) { //该节点只有一个节点,且为右子节点

if (current ==root) {

root=current.rightChildNode;

}else if(isLeftchild) {

parent.leftChildNode=current.rightChildNode;

}else{

parent.rightChildNode=current.rightChildNode;

}

}else{

Node successor= getSuccessor(current);//查找中序后继节点

if(current == root) { //以下是完成替换功能

root =successor;

}else if(isLeftchild) {

parent.leftChildNode=successor;

}else{

parent.rightChildNode=successor;

}

successor.leftChildNode=current.leftChildNode;

}return true;

}public static voidmain(String[] args) {

Tree tree= newTree();

tree.insertNode(10, "zhangsan");

tree.insertNode(20, "lisi");

tree.insertNode(3, "wangwu");

tree.insertNode(14, "zhaoliu");

tree.insertNode(76, "zhouqi");

tree.insertNode(5, "niaho");//System.out.println(tree.root.data);//System.out.println(tree.root.leftChildNode.data);//System.out.println(tree.root.rightChildNode.data);//System.out.println(tree.root.rightChildNode.leftChildNode.data);//System.out.println(tree.root.rightChildNode.rightChildNode.data);//Node node = tree.findNode(20);//System.out.println(node.data + "," + node.sdata);//System.out.println(node.rightChildNode.data + "," +//node.rightChildNode.sdata);

tree.fontOrder(tree.root);

tree.deleteNode(3);

System.out.println("--------------------");

tree.fontOrder(tree.root);

tree.deleteNode(20);

System.out.println("------------------------");

tree.fontOrder(tree.root);

}

}classNode {//数据域

public intdata;publicString sdata;//指针域

publicNode leftChildNode;publicNode rightChildNode;public Node(intdata, String sdata) {//TODO Auto-generated constructor stub

this.data =data;this.sdata =sdata;

}

}

2.4根据中序和后序,求前序遍历

packageexam;importjava.util.Arrays;public classMain {public static voidmain(String[] args) {//TODO Auto-generated method stub//Scanner sc = new Scanner(System.in);//String in = sc.nextLine();

String in = "dgbaechf";char[] inArray =in.toCharArray();//String last = sc.nextLine();

String last = "gbdehfca";char[] lastArray =last.toCharArray();//System.out.println(Arrays.toString(preArray));//System.out.println(Arrays.toString(inArray));

Node node =buildTree(inArray, lastArray);

frontOrder(node);

}public static Node buildTree(char[] inorder, char[] postorder) {if (inorder == null || postorder == null || inorder.length == 0 || postorder.length == 0) {return null;

}//将后序遍历的最后一个节点取出为根

Node root = new Node(postorder[postorder.length - 1]);int i = 0;//记录中序遍历根的位置

for (; i < inorder.length; i++) {if (postorder[postorder.length - 1] ==inorder[i]) {break;

}

}//构造左子树

char[] leftIn = Arrays.copyOfRange(inorder, 0, i);char[] leftPost = Arrays.copyOfRange(postorder, 0, i);//构造右子树

char[] rightIn = Arrays.copyOfRange(inorder, i + 1, inorder.length);char[] rightPost = Arrays.copyOfRange(postorder, i, postorder.length - 1);//左子树

root.leftChild =buildTree(leftIn, leftPost);//右子树

root.rightChild =buildTree(rightIn, rightPost);returnroot;

}/*** 前序遍历*/

public static voidfrontOrder(Node localNode) {if (localNode != null) {//访问根节点

System.out.print(localNode.data + " ");//前序遍历左子树

frontOrder(localNode.leftChild);//前序遍历右子树

frontOrder(localNode.rightChild);

}

}

}/*** 二叉树节点*/

classNode {//数据项

public chardata;publicNode leftChild;publicNode rightChild;public Node(chardata) {this.data =data;

}

}

11b7f26898baed16153aee33bc9475bd.png

2.5二叉树高度

51d667d46ce5a6ae9cf26b087383efb3.png

packagedatastruct.t04tree;/*** 二叉树节点

**/

public classNode {public intdata;publicNode leftChild;publicNode rightChild;public Node(intdata) {this.data =data;

}public voidsetLeftChild(Node leftChild) {this.leftChild =leftChild;

}public voidsetRightChild(Node rightChild) {this.rightChild =rightChild;

}public static Node createNode(intdata) {

Node node= newNode(data);

node.leftChild= node.rightChild = null;returnnode;

}public static voidsetChild(Node node, Node leftChild, Node rightChild) {

node.setLeftChild(leftChild);

node.setRightChild(rightChild);

}

}

packagedatastruct.t04tree;public classBiTree {public static intgetTreeHeight(Node root) {if (root == null) {return 0;

}else{int leftHeight =getTreeHeight(root.leftChild);int rightHeight =getTreeHeight(root.rightChild);return Math.max(leftHeight, rightHeight) + 1;

}

}public static voidmain(String[] args) {//快速构建一棵二叉树

Node root = Node.createNode(1);

Node node2= Node.createNode(2);

Node node3= Node.createNode(3);

Node node4= Node.createNode(4);

Node node5= Node.createNode(5);

Node node6= Node.createNode(6);

Node node7= Node.createNode(7);

Node node8= Node.createNode(8);

Node.setChild(root, node2, node3);

Node.setChild(node2, node4, node5);

Node.setChild(node3,null, node7);

Node.setChild(node4,null, node8);

Node.setChild(node5, node6,null);//树的高度

int height =getTreeHeight(root);

System.out.print("树的高度为:");

System.out.println(height);

}

}

a616c2a3707fbadd53792472eaf8f632.png

2.6表达式树的输出与求值

表达式树的特征:叶节点是运算数,非叶节点一定是运算符

0991a455f4c22095da81965ad87cd6bd.png

输入格式:

第一行给出节点的个数N,每个节点的编号为0 ~ N-1

接下来N行每行分别给出:

该节点的编号、该节点的操作数/操作符、该节点的左孩子编号、右孩子编号(-1表示NULL)

输出格式:

第一行输出该表达式树的中缀表达式,该用括号的地方需要用括号括起来。

第二行输出该表达式树的前缀表达式。

第二行输出该表达式树的后缀表达式。

第四行输出该表达式树的计算结果,保留两位小数。

样例输入:

11

0 - 1 2

1 + 3 4

2 / 5 6

3 4 -1 -1

4 * 7 8

5 6 -1 -1

6 3 -1 -1

7 1 -1 -1

8 - 9 10

9 5 -1 -1

10 2 -1 -1

样例输出:

(4+(1*(5-2)))-(6/3)- + 4 * 1 - 5 2 / 6 3

4 1 5 2 - * + 6 3 / -

5.00

packagedatastruct.t04tree.exptree;public classNode {chardata;

Node leftChild;

Node rightChild;

}

packagedatastruct.t04tree.exptree;importjava.util.Scanner;public classExpTree {//中缀表达式

public static void inOrder(Node root, intlayer) {if (root == null)return;if (root.leftChild == null && root.rightChild == null) {//叶结点是操作数,直接输出,不加括号

System.out.print(root.data + " ");

}else{//非叶节点是操作符,需加括号(第0层根节点除外)

if (layer > 0) {

System.out.print("(");

}

inOrder(root.leftChild, layer+ 1);

System.out.print(root.data+ " ");

inOrder(root.rightChild, layer+ 1);if (layer > 0) {

System.out.print(")");

}

}

}//前缀表达式

public static voidpreOrder(Node root) {if (root == null)return;

System.out.print(root.data+ " ");

preOrder(root.leftChild);

preOrder(root.rightChild);

}//后缀表达式

public static voidpostOrder(Node root) {if (root == null)return;

postOrder(root.leftChild);

postOrder(root.rightChild);

System.out.print(root.data+ " ");

}public static doublegetExpTree(Node root) {if (root == null) {return 0;

}if (root.leftChild == null && root.rightChild == null) {//叶节点,节点存放的是 操作数

return root.data - '0'; //将字符转换成数字

}//非叶结点,节点存放的是 操作符

double a =getExpTree(root.leftChild);double b =getExpTree(root.rightChild);returncal(a, b, root.data);

}public static double cal(double a, double b, charop) {switch(op) {case '+':return a +b;case '-':return a -b;case '*':return a *b;case '/':return a /b;default:return 0;

}

}public static voidmain(String[] args) {

Scanner input= newScanner(System.in);

System.out.println("请输入节点的个数");int N =input.nextInt();

Node[] nodes= newNode[N];for (int i = 0; i < N; i++) {

nodes[i]= newNode();

}

System.out.println("请输入index,data,l,r");for (int i = 0; i < N; i++) {int index =input.nextInt();char data = input.next().charAt(0);int l =input.nextInt();int r =input.nextInt();

nodes[index].data=data;

nodes[index].leftChild= (l != -1 ? nodes[l] : null);

nodes[index].rightChild= (r != -1 ? nodes[r] : null);

}

Node root= nodes[0];

inOrder(root,0);

System.out.println();

preOrder(root);

System.out.println();

postOrder(root);

System.out.println();double value =getExpTree(root);

System.out.println(value);

}

}

1bf43b5d53990244537482bc3f1014ad.png

2.7求二叉树指定节点所在层数(假设根节点的层数为1)

254d58787eb5a51a4e043adc7dce2676.png

1.方法1

packagedatastruct.t04tree.layer;classNode {intdata;

Node leftChild;

Node rightChild;public Node(intdata) {this.data =data;

}public voidsetChild(Node leftChild, Node rightChild) {this.leftChild =leftChild;this.rightChild =rightChild;

}

}public classNodeLayer {static int layer = 0;static boolean flag = false;//flag标记可用于提前快速结束递归的执行

public static void getNodeLayer(Node root, intvalue) {if (root == null)return;if(flag)return;

layer++;if (root.data ==value) {

System.out.println(layer);

flag= true;return;

}

getNodeLayer(root.leftChild, value);

getNodeLayer(root.rightChild, value);

layer--;

}public static voidmain(String[] args) {

Node root= new Node(1);

Node node2= new Node(2);

Node node3= new Node(3);

Node node4= new Node(4);

Node node5= new Node(5);

Node node6= new Node(6);

Node node7= new Node(7);

Node node8= new Node(8);

root.setChild(node2, node3);

node2.setChild(node4, node5);

node3.setChild(null, node6);

node5.setChild(node7,null);

node7.setChild(null, node8);int value = 7;

getNodeLayer(root, value);

}

}

2d1df325d46999d712a3f7ebaf9acda9.png

2.方法2

packagedatastruct.t04tree.layer;classNode {intdata;

Node leftChild;

Node rightChild;public Node(intdata) {this.data =data;

}public voidsetChild(Node leftChild, Node rightChild) {this.leftChild =leftChild;this.rightChild =rightChild;

}

}public classNodeLayer {

static boolean flag = false;public static void getNodeLayer(Node root, int value, intlayer) {if (root == null)return;if(flag)return;if (root.data ==value) {

System.out.println(layer);

flag= true;return;

}

getNodeLayer(root.leftChild, value, layer+ 1);

getNodeLayer(root.rightChild, value, layer+ 1);

}public static voidmain(String[] args) {

Node root= new Node(1);

Node node2= new Node(2);

Node node3= new Node(3);

Node node4= new Node(4);

Node node5= new Node(5);

Node node6= new Node(6);

Node node7= new Node(7);

Node node8= new Node(8);

root.setChild(node2, node3);

node2.setChild(node4, node5);

node3.setChild(null, node6);

node5.setChild(node7,null);

node7.setChild(null, node8);int value = 7;

getNodeLayer(root, value, 1);

}

}

271919a1022228b574696bcd739bdd7f.png

2.8求某节点到根节点的路径

对于如下二叉树,节点 7 位于第 4 层,其到跟节点的路径为 1 2 5 7

5d06ba42ad2b715bc6f4262de870485b.png

packagedatastruct.t04tree.path;importjava.util.Stack;classNode {intdata;

Node leftChild;

Node rightChild;public Node(intdata) {this.data =data;

}public voidsetChild(Node leftChild, Node rightChild) {this.leftChild =leftChild;this.rightChild =rightChild;

}

}public classTreePath {static Stack path = new Stack<>();static boolean flag = false;public static void getNodePath(Node root, intvalue) {if (root == null)return;if(flag)return;

path.add(root.data);if (root.data ==value) {for(Integer integer : path) {

System.out.print(integer+ " ");

}

flag= true;return;

}

getNodePath(root.leftChild, value);

getNodePath(root.rightChild, value);

path.pop();

}public static voidmain(String[] args) {

Node root= new Node(1);

Node node2= new Node(2);

Node node3= new Node(3);

Node node4= new Node(4);

Node node5= new Node(5);

Node node6= new Node(6);

Node node7= new Node(7);

Node node8= new Node(8);

root.setChild(node2, node3);

node2.setChild(node4, node5);

node3.setChild(null, node6);

node5.setChild(node7,null);

node7.setChild(null, node8);int value = 7;

getNodePath(root, value);

}

}

17cc859f015137378ebc034eb73fdf13.png

2.9全排列问题

输出数字1~N所能组成的所有全排列

c1555c02ef1650b93dee7637a020f719.png

packagedatastruct.t04tree.permutation;importjava.util.Stack;public classPermutation {public static int MAXN = 10;static boolean[] isUsed = new boolean[MAXN];static Stack nums = new Stack<>();static intN;/***@paramindex

* 表示第几层*/

public static void DFS(intindex) {if (index >=N) {for(Integer i : nums)

System.out.print(i+ " ");

System.out.println();return;

}for (int i = 1; i <= N; i++) {if(isUsed[i])continue;

nums.push(i);

isUsed[i]= true;

DFS(index+ 1);

nums.pop();

isUsed[i]= false;

}

}public static voidmain(String[] args) {

N= 3;

DFS(0);//从第0层开始搜索

}

}

1891fea9c566be57411d9e8731ffc0c3.png

3.红黑树

f812ea73e6b26004e314bb403fbb522f.png

9fde6ce1f7ba19b9c79d930db144b142.png

4.hash表

5526f563d2e3d2aaca4d8754712f82c2.png

4.1直接将关键字作为索引

packagech15;public classInfo {private intkey;privateString name;public Info(intkey, String name) {//TODO Auto-generated constructor stub

this.key =key;this.name =name;

}public intgetKey() {returnkey;

}public void setKey(intkey) {this.key =key;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

}

packagech15;public classHashTable {privateInfo[] arr;publicHashTable() {//TODO Auto-generated constructor stub

arr = new Info[100];

}public HashTable(intmaxSize) {

arr= newInfo[maxSize];

}public voidinsert(Info info) {

arr[info.getKey()]=info;

}public Info find(intkey) {returnarr[key];

}

}

packagech15;public classTestHashTable {public static voidmain(String[] args) {

HashTable hTable= newHashTable();

hTable.insert(new Info(10, "张三"));

hTable.insert(new Info(15, "李四"));

System.out.println(hTable.find(15).getName());

}

}

974f747312a20e2c75fbabe23bdae5f0.png

4.2将单词转化为索引

packagech15;public classInfo {privateString key;privateString name;publicInfo(String key, String name) {//TODO Auto-generated constructor stub

this.key =key;this.name =name;

}publicString getKey() {returnkey;

}public voidsetKey(String key) {this.key =key;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

}

packagech15;public classHashTable {privateInfo[] arr;publicHashTable() {//TODO Auto-generated constructor stub

arr = new Info[100];

}public HashTable(intmaxSize) {

arr= newInfo[maxSize];

}public voidinsert(Info info) {

arr[hashCode(info.getKey())]=info;

}publicInfo find(String key) {returnarr[hashCode(key)];

}public inthashCode(String key) {int hashValue = 0;for (int i = key.length() - 1; i >= 0; i--) {int letter = key.charAt(i) - 96;

hashValue+=letter;

}returnhashValue;

}

}

packagech15;public classTestHashTable {public static voidmain(String[] args) {

HashTable hTable= newHashTable();

hTable.insert(new Info("zhangsan", "张三"));

hTable.insert(new Info("lisi", "李四"));

System.out.println(hTable.find("zhangsan").getName());

}

}

eade14c5a5e3b21accbe9e938d3cb2e5.png

以上方法也会存在一定的问题,当hashcode相同的时候。

packagech15;public classTestHashTable {public static voidmain(String[] args) {

HashTable hTable= newHashTable();

hTable.insert(new Info("abc", "张三"));

hTable.insert(new Info("bca", "李四"));

System.out.println(hTable.find("abc").getName());

System.out.println(hTable.find("bca").getName());

}

}

b1d0f5ea0637f86fd9a62854e9307a84.png

我们用幂函数的方式去重写hashcode

public inthashCode(String key) {int hashValue = 0;int pow27 = 1;for (int i = key.length() - 1; i >= 0; i--) {int letter = key.charAt(i) - 96;

hashValue+= letter *pow27;

pow27*= 27;

}returnhashValue;

}

packagech15;public classTestHashTable {public static voidmain(String[] args) {

HashTable hTable= newHashTable();

hTable.insert(new Info("abc", "张三"));

hTable.insert(new Info("bca", "李四"));

System.out.println(hTable.find("abc").getName());

System.out.println(hTable.find("bca").getName());

}

}

f7250689744b1e714493de9160791a67.png

此时可以解决上面的问题,但是浪费太多内存了,因为字符串如果很长,数组容易越界或者内存溢出,因此需要进行取模运算。

public inthashCode(String key) {

BigInteger hashValue= new BigInteger("0");

BigInteger pow27= new BigInteger("1");for (int i = key.length() - 1; i >= 0; i--) {int letter = key.charAt(i) - 96;

BigInteger letterB= newBigInteger(String.valueOf(letter));

hashValue=hashValue.add(letterB.multiply(pow27));

pow27= pow27.multiply(new BigInteger(String.valueOf(27)));

}return hashValue.mod(newBigInteger(String.valueOf(key.length()))).intValue();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中methods方法_java中Class.getMethod方法

Method Class.getMethod(String name, Class>... parameterTypes)的作用是获得对象所声明的公开方法该方法的第一个参数name是要获得方法的名字&#xff0c;第二个参数parameterTypes是按声明顺序标识该方法形参类型。person.getClass().getMethod("Speak", null)…

centos6 yum快速安装mysql_centos6.10 yum安装mysql 5.6-Go语言中文社区

一、检查系统是否安装其他版本的MYSQL数据#yum list installed | grep mysql#yum -y remove 文件名二、安装及配置# wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm# rpm -ivh mysql-community-release-el6-5.noarch.rpm# yum repolist all | grep mysq…

二叉树两节点距离java,求二叉树中两个节点的最远距离

问题定义如果我们把二叉树看成一个图&#xff0c;父子节点之间的连线看成是双向的&#xff0c;我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节…

php cli 编程,php-cli下编程如何分层架构、面向对象、统一入口文件?

以往写cli下运行的业务或者测试代码&#xff0c;总是新建文件&#xff0c;面向过程编写代码。几次之后&#xff0c;cli目录下好多文件&#xff0c;即便勉强在一个cli测试文件中写了一个类&#xff0c;也是让其中的一个方法自启动&#xff0c;要测试别的方法&#xff0c;总是要修…

php中gd为什么是乱码的,php gd库中文乱码怎么解决?

php gd库中文乱码怎么解决&#xff1f;,中文,乱码,字符,选项,字体php gd库中文乱码怎么解决&#xff1f;易采站长站&#xff0c;站长之家为您整理了php gd库中文乱码怎么解决&#xff1f;的相关内容。解决方法&#xff1a;1、网站整站使用UTF8编码&#xff0c;如果已使用GB2312…

php实现飘窗,JS实现网站图片飘窗效果,JavaScript悬浮广告(附详细代码)

原标题&#xff1a;JS实现网站图片飘窗效果&#xff0c;JavaScript悬浮广告(附详细代码)JS实现网站图片飘窗效果&#xff0c;Java悬浮广告&#xff0c;郑州SEO提供以下代码&#xff0c;仅供参考&#xff1a;飘窗效果-丁光辉博客(www.dingguanghui.com)*{margin:0px;padding:0px…

oracle中orand使用,Postgres兼容Oracle研究——orafce调研

一、背景PostgreSQL是和Oracle最接近的企业数据库&#xff0c;包括数据类型&#xff0c;功能&#xff0c;架构和语法等几个方面。甚至大多数的日常应用的性能也不会输给Oracle。但是Oracle有些函数或者包&#xff0c;默认PostgreSQL是没有的&#xff0c;需要安装orafce包来实现…

labview linux 内核 不匹配,Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退,LabVIEW就崩溃。...

Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退&#xff0c;LabVIEW就崩溃。我安装了LabVIEW pro 2017 for Linux(另外也试了2016版的都是一样的效果)&#xff0c;VISA也试了4.1.0、4.4.0、5.1.1、15.0.0、15.5.0、16.0.0、17.0.0版本都试过了&#…

kali linux子远程桌面,适用于kali linux的远程桌面开启方法(从windows xp 远程登录到kali linux )...

为了解决Windows远程桌面访问Ubuntu 12.04 之一 中提到的VNC远程桌面的缺点(见http://www.linuxidc.com/Linux/2012-07/64801.htm)&#xff0c;我们采用第二种方法XRDP&#xff0c;该方法支持多用户登录并远程桌面。1、首先参考Windows远程桌面访问Ubuntu 12.04 之安装VNC中提到…

linux装redis环境变量,linux 怎样安装redis

人到中年有点甜获取Redis1、通过官网http://redis.io/获取稳定版源码包下载地址&#xff1b;2、通过wget http://download.redis.io/releases/redis-3.0.2.tar.gz下载 源码包&#xff1b;2编译安装Redis1、解压源码安装包&#xff0c;通过tar -xvf redis-3.0.2.tar.gz解压源码&…

word2016能识别linux换行符,word文章中的换行符如何批量替换为回车符

word文件中有换行符很正常&#xff0c;但是想要将换行符全部替换为回车符&#xff0c;该怎么替换?以下是学习啦小编为您带来的关于word文章中的换行符批量替换为回车符&#xff0c;希望对您有所帮助。word文章中的换行符批量替换为回车符1、在打开的word中&#xff0c;依次点击…

linux禁用防火墙配置,CentOS Linux防火墙配置及关闭

最近在CentOS Linux下安装配置 Oracle 数据库的时候&#xff0c;总显示因为网络端口而导致的EM安装失败&#xff0c;遂打算先关闭一下防火墙。偶然看到防火墙的配置操作说明&#xff0c;感觉不错。执行”setup”命令启动文字模式配置实用程序,在”选择一种工具”中选择”防火墙…

C语言CASE语句嵌套,C语言中switch case语句的嵌套

给一个含有嵌套的switch case的一段完整代码&#xff1a;#include int main(){int n1;int m2;switch(n){case 1:m;case 2:n;case 3:switch(n){case 1:n;case 2:m;n;break;}case 4:m;break;default:break;}printf("%d %d",m,n);return 0;}代码看起来很简单&#xff0c…

linux dd 进度条,Progress 进度条 – DDProgressHUD

DDProgressHUDProgress 进度条&#xff0c;UIActivityIndicatorView 小菊花&#xff0c;弹窗&#xff0c;状态显示&#xff0c;高度自定义DDProgressHUD的介绍提供了四种类型的展示&#xff1a;显示无限旋转的加载图(比如小菊花&#xff0c;可以自定义)&#xff0c;显示文字信息…

Android动态图标包制作教程,安卓手机ico图标制作美化图文教程

如何让手机更加与众不同?今天我们就来学习如何利用出色的ico图标制作软件——Axialis IconWorkshop制作出美化手机屏幕的个性图标!如今&#xff0c;每个人都有属于自己的手机&#xff0c;每天使用手机聊QQ、刷微博、玩游戏&#xff0c;可以说手机已经是很多人生活中不可缺少的…

android progressbar 水平动画,Android ProgressBar 自定义样式(三),动画模式

果&#xff1a;和之前的一样&#xff0c;在布局文件中&#xff1a;android:id"id/progressBar3"android:layout_width"wrap_content"android:layout_height"wrap_content"android:indeterminate"false"android:indeterminateDrawable&…

android gridview行分割线,Android使用GridView实现表格分割线效果

使用gridview实现表格分割线效果&#xff0c;网格布局表格布局也是可以实现的。效果如下&#xff1a;1.主函数代码&#xff1a;package com.example.qd.douyinwu;import android.app.activity;import android.content.context;import android.os.bundle;import android.support…

android hook 实例,代码实例分析android中inline hook

以下内容通过1、实现目标注入程序&#xff0c;2、实现主程序&#xff0c;3、实现注入函数&#xff0c;4、thumb指令集实现等4个方面详细分析了android中inline hook的用法&#xff0c;以下是全部内容&#xff1a;最近终于沉下心来对着书把hook跟注入方面的代码敲了一遍&#xf…

dax 筛选 包含某个字_筛选状态(ALL与REMOVEFILTERS)

这一章比较绕&#xff0c;但是帮助我们理清切片器的筛选状态以及主要函数对于公式筛选上下文的改变。1.切片器的筛选状态切片器的全选与全不选的状态的区别&#xff0c;我们可以看下图&#xff1a;全不选全选多个点击筛选逐个点击至全部结论初始状态&#xff0c;没有选择任何元…

山东鲁能轨道智能巡检机器人_温湿度传感器在轨道巡检机器人中的应用

▲地下综合管廊智慧管廊建设&#xff0c;是智慧城市在地下的一个缩影&#xff0c;有助于缓解“大城市病”&#xff0c;实现精细化和动态管理。与此同时&#xff0c;各种传感器技术也将被运用到地下综合管廊运维的每一环&#xff0c;这其中&#xff0c;地下管廊巡检机器人便是其…