103.输入一个链表,从尾到头打印链表每个节点的值。
- import java.util.*;
- public class Solution {
- public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
- Stack<Integer>stack=new Stack<Integer>();
- ArrayList<Integer>arrayList=new ArrayList<Integer>();
- if(listNode==null)
- return arrayList;
- while(listNode!=null)
- {
- stack.add(listNode.val);
- listNode=listNode.next;
- }
- while(!stack.empty()){
- arrayList.add(stack.pop());
- }
- return arrayList;
- }
- }
------------------------------------------------------------------------------------------------------------------------------------------
104.输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
- import java.util.ArrayList;
- public class Solution {
- public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
- TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
- return root;
- }
- private TreeNode reConstructBinaryTree(int[] pre,int preStart,int preEnd,int[] in,int inStart,int inEnd)
- {
- if(preStart>preEnd||inStart>inEnd)
- return null;
- TreeNode root=new TreeNode(pre[preStart]);
- for(int i=inStart;i<=inEnd;i++)
- if(in[i]==pre[preStart])
- {
- root.left=reConstructBinaryTree(pre,preStart+1,preStart+i-inStart,in,inStart,i-1);
- root.right=reConstructBinaryTree(pre,preStart+i-inStart+1,preEnd,in,i+1,inEnd);
- }
- return root;
- }
- }
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
111.输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,
原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。
举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,
而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。
这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。
如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,
就可以进行多少次这样的操作。
- public class Solution {
- public int NumberOf1(int n) {
- int count = 0;
- while(n!= 0){
- count++;
- n = n & (n - 1);
- }
- return count;
- }
- }
-------------------------------------------------------------------------------------------------------------------------------------------
114输入一个链表,输出该链表中倒数第k个结点。
- public class Solution {
- public ListNode FindKthToTail(ListNode head,int k) {
- if(head==null||k<=0)
- return null;
- ListNode pre=head;
- ListNode last=head;
- for(int i=1;i<k;i++)
- {
- if(pre.next!=null)
- pre=pre.next;
- else
- return null;
- }
- while(pre.next!=null)
- {
- pre=pre.next;
- last=last.next;
- }
- return last;
- }
- }
--------------------------------------------------------------------------------------------------------------------------------------------------------
115输入一个链表,反转链表后,输出链表的所有元素
- public class Solution {
- public ListNode ReverseList(ListNode head) {
- if (head == null)
- return head;
- ListNode dummy = new ListNode(-1);
- dummy.next = head;
- ListNode prev = dummy.next;
- ListNode pCur = prev.next;
- while (pCur != null) {
- prev.next = pCur.next;
- pCur.next = dummy.next;
- dummy.next = pCur;
- pCur = prev.next;
- }
- return dummy.next;
- }
- }
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
116输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
- public class Solution {
- public ListNode Merge(ListNode list1,ListNode list2) {
- if(list1==null)
- return list2;
- if(list2==null)
- return list1;
- ListNode res=null;
- if(list1.val<list2.val)
- {
- res=list1;
- res.next=Merge( list1.next,list2);
- }
- else
- {
- res=list2;
- res.next=Merge( list2.next,list1);
- }
- return res;
- }
- }
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
117.输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
- public class Solution {
- public boolean HasSubtree(TreeNode root1,TreeNode root2) {
- if(root1==null||root2==null)
- return false;
- boolean flag=false;
- if(root1.val==root2.val)
- flag=isSubtree(root1,root2);
- if(!flag)
- {
- flag=HasSubtree(root1.left,root2);
- if(!flag)
- flag=HasSubtree(root1.right,root2);
- }
- return flag;
- }
- public boolean isSubtree(TreeNode root1,TreeNode root2)
- {
- if(root2==null)
- return true;
- if(root1==null&&root2!=null)
- return false;
- if(root1.val==root2.val)
- return isSubtree(root1.left,root2.left)&&isSubtree(root1.right,root2.right);
- else
- return false;
- }
- }
------------------------------------------------------------------------------------------------------------------------------
118
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
- import java.util.Stack;
- public class Solution {
- public void Mirror(TreeNode root) {
- if(root==null)
- return;
- Stack<TreeNode>stack=new Stack<TreeNode>();
- stack.push(root);
- while(!stack.empty())
- {
- TreeNode node=stack.pop();
- if(node.left!=null||node.right!=null)
- {
- TreeNode nodeleft=node.left;
- TreeNode noderight=node.right;
- node.left=noderight;
- node.right=nodeleft;
- }
- if(node.left!=null)
- stack.push(node.left);
- if(node.right!=null)
- stack.push(node.right);
- }
- }
- }
-----------------------------------------------------------------------------------------------------------------
119输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
- import java.util.ArrayList;
- public class Solution {
- public ArrayList<Integer> printMatrix(int [][] matrix) {
- int n=matrix.length;
- int m=matrix[0].length;
- ArrayList<Integer>res=new ArrayList<Integer>();
- int i=0;
- int j=0;
- int startX=0;
- int endX=m-1;
- int startY=0;
- int endY=n-1;
- while(startX<=endX&&startY<=endY)
- {
- if(startX==endX)
- {
- for(;i<=endY;i++)
- res.add(matrix[i][j]);
- return res;
- }
- if(startY==endY)
- {
- for(;j<=endX;j++)
- res.add(matrix[i][j]);
- return res;
- }
- for(;j<endX;j++)
- res.add(matrix[i][j]);
- for(;i<endY;i++)
- res.add(matrix[i][j]);
- for(;j>startX;j--)
- res.add(matrix[i][j]);
- for(;i>startY;i--)
- res.add(matrix[i][j]);
- i++;
- j++;
- startX++;
- endX--;
- startY++;
- endY--;
- }
- return res;
- }
- }
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
120.定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
- import java.util.Stack;
- import java.util.Iterator;
- public class Solution {
- Stack<Integer>stack=new Stack<Integer>();
- public void push(int node) {
- stack.push(node);
- }
- public void pop() {
- stack.pop();
- }
- public int top() {
- return stack.peek();
- }
- public int min() {
- int min=stack.peek();
- int tmp=0;
- Iterator<Integer>iterator=stack.iterator();
- while(iterator.hasNext())
- {
- tmp=iterator.next();
- min=min<=tmp?min:tmp;
- }
- return min;
- }
- }
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
201输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,
但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
- import java.util.*;
- public class Solution {
- public boolean IsPopOrder(int [] pushA,int [] popA) {
- Stack <Integer> stack=new Stack<Integer> ();
- int j=0;
- for(int i=0;i<pushA.length;i++){
- stack.push(pushA[i]);
- while(!stack.empty()&&stack.peek()==popA[j]){
- j++;
- stack.pop();
- }
- }
- if(stack.empty())
- return true;
- return false;
- }
- }
202从上往下打印出二叉树的每个节点,同层节点从左至右打印。
- import java.util.LinkedList;
- import java.util.Deque;
- public class Solution {
- public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
- ArrayList<Integer>res=new ArrayList<Integer>();
- if(root==null)
- return res;
- Deque<TreeNode>deq=new LinkedList<TreeNode>();
- deq.add(root);
- while(!deq.isEmpty())
- {
- TreeNode t=deq.pop();
- res.add(t.val);
- if(t.left!=null)
- deq.add(t.left);
- if(t.right!=null)
- deq.add(t.right);
- }
- return res;
- }
- }
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
209.输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
topK问题,可以用堆解决。
- import java.util.ArrayList;
- import java.util.Comparator;
- import java.util.PriorityQueue;
- public class Solution {
- public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
- ArrayList<Integer>result=new ArrayList<Integer>();
- int length = input.length;
- if(k > length || k == 0){
- return result;
- }
- PriorityQueue<Integer>maxHeap=new PriorityQueue<Integer>(k,new Comparator<Integer>(){
- @Override
- public int compare(Integer o1, Integer o2) {
- // TODO Auto-generated method stub
- return o2.compareTo(o1);
- }
- });
- for(int i=0;i<length;i++){
- if(maxHeap.size()!=k){
- maxHeap.offer(input[i]);
- }
- else
- if(maxHeap.peek()>input[i])
- {
- maxHeap.poll();
- maxHeap.offer(input[i]);
- }
- }
- for(Integer i:maxHeap){
- result.add(i);
- }
- return result;
- }
- }
----------------------------------------------------------------------------------------------------------------------------------------------------------
210.连续子数组和最大
- public class Solution {
- public int FindGreatestSumOfSubArray(int[] array) {
- if(array.length==0)
- return 0;
- int max=array[0];
- int total=array[0];
- for(int i=1;i<array.length;i++)
- {
- if(total>0)
- total+=array[i];
- else
- total=array[i];
- max=max>total?max:total;
- }
- return max;
- }
- }
---------------------------------------------------------------------------------------------------------------------------------------------
211求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,
但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
- public class Solution {
- public int NumberOf1Between1AndN_Solution(int n) {
- int sum=0;
- for(int i=1;i<=n;i++)
- {
- int tmp=0;
- String str=String.valueOf(i);
- for(int j=0;j<str.length();j++)
- {
- if(str.charAt(j)=='1')
- tmp++;
- }
- sum+=tmp;
- }
- return sum;
- }
- }
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},
则打印出这三个数字能排成的最小数字为321323。
- import java.util.*;
- public class Solution {
- public String PrintMinNumber(int [] numbers) {
- if(numbers.length==0)
- return "";
- int len=numbers.length;
- compSort(numbers,len);
- String[] str=new String[len];
- for(int i=0;i<len;i++)
- str[i]=String.valueOf(numbers [i]);
- StringBuffer sb=new StringBuffer();
- for(int i=0;i<len;i++)
- sb.append(str[i]);
- return sb.toString();
- }
- private void compSort(int[] ch,int length)
- {
- for(int i=0;i<length-1;i++)
- for(int j=i+1;j<length;j++)
- {
- int mark1=1,mark2=1,m=ch[i],n=ch[j];
- while(m>=1)
- {
- m/=10;
- mark1*=10;
- }
- while(n>=1)
- {
- n/=10;
- mark2*=10;
- }
- if(ch[i]*mark2+ch[j]>ch[j]*mark1+ch[i])
- {
- ch[i]=ch[i]+ch[j];
- ch[j]=ch[i]-ch[j];
- ch[i]=ch[i]-ch[j];
- }
- }
- }
- }
----------------------------------------------------------------------------------------------------------------------------------
在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置。如果字符串为空,返回-1
- import java.util.LinkedHashMap;
- public class Solution {
- public int FirstNotRepeatingChar(String str) {
- LinkedHashMap<Character,Integer>map=new LinkedHashMap<Character, Integer>();
- int time=0;
- for(int i=0;i<str.length();i++){
- if(map.containsKey(str.charAt(i))){
- time=map.get(str.charAt(i));
- map.put(str.charAt(i), ++time);//不能用time++
- }
- else
- map.put(str.charAt(i), 1);
- }
- for(int i=0;i<str.length();i++){
- if(map.get(str.charAt(i))==1){
- return i;
- }
- }
- return -1;
- }
- }
----------------------------------------------------------------------------------------------------------------------------------------------------------------
216输入两个链表,找出它们的第一个公共结点。
- public class Solution {
- /**
- * 思路:如果有公共节点,1)若两个链表长度相等,那么遍历一遍后,在某个时刻,p1 == p2
- * 2)若两个链表长度不相等,那么短的那个链表的指针pn(也就是p1或p2)
- * 必先为null,那么这时再另pn = 链表头节点。经过一段时间后,
- * 则一定会出现p1 == p2。
- * 如果没有公共节点:这种情况可以看成是公共节点为null,顾不用再考虑。
- */
- public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
- ListNode p1 = pHead1;
- ListNode p2 = pHead2;
- while(p1 != p2) {
- if(p1 != null) p1 = p1.next; //防止空指针异常
- if(p2 != null) p2 = p2.next;
- if(p1 != p2) { //当两个链表长度不想等
- if(p1 == null) p1 = pHead1;
- if(p2 == null) p2 = pHead2;
- }
- }
- return p1;
- }
- }
---------------------------------------------------------------------------------------------------------------------------------------------------
217统计一个数字在排序数组中出现的次数
- public class Solution {
- public int GetNumberOfK(int [] array , int k) {
- int length=array.length;
- if(length==0)
- return 0;
- int firstK = getFirstK(array, k, 0, length-1);
- int lastK = getLastK(array, k, 0, length-1);
- if(firstK != -1 && lastK != -1){
- return lastK - firstK + 1;
- }
- return 0;
- }
- private int getFirstK(int []array,int k, int start, int end){
- int mid=(start+end)>>1;
- while(start<=end)
- {
- if(array[mid]<k){
- start=mid+1;
- }
- else
- {
- end=mid-1;
- }
- mid=(start+end)/2;
- }
- return start;
- }
- private int getLastK(int []array,int k, int start, int end){
- int mid=(start+end)>>1;
- while(start<=end)
- {
- if(array[mid]<=k){
- start=mid+1;
- }
- else
- {
- end=mid-1;
- }
- mid=(start+end)/2;
- }
- return end;
- }
- }
-----------------------------------------------------------------------------------------------------------------------------------
218输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
- public class Solution {
- public int TreeDepth(TreeNode root) {
- if(root==null)
- return 0;
- return TreeDepth(root.left)>TreeDepth(root.right)?(TreeDepth(root.left)+1):(TreeDepth(root.right)+1);
- }
- }
--------------------------------------------------------------------------------------------------------------------------
219输入一棵二叉树,判断该二叉树是否是平衡二叉树。
- public class Solution {
- public boolean IsBalanced_Solution(TreeNode root) {
- if(root==null)
- return true;
- int leftDep=TreeDepth(root.left);
- int rightDep=TreeDepth(root.right);
- if(leftDep-rightDep>1||leftDep-rightDep<-1)
- return false;
- return(IsBalanced_Solution(root.left)&&IsBalanced_Solution(root.right));
- }
- public int TreeDepth(TreeNode root)
- {
- if(root==null)
- return 0;
- int max=1+TreeDepth(root.left)>1+TreeDepth(root.right)?1+TreeDepth(root.left):1+TreeDepth(root.right);
- return max;
- }
- }
-------------------------------------------------------------------------------------------------------------------------------------
220一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- //num1,num2分别为长度为1的数组。传出参数
- //将num1[0],num2[0]设置为返回结果
- import java.util.*;
- public class Solution {
- public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
- ArrayList<Integer>al=new ArrayList<Integer>();
- for(int i=0;i<array.length;i++)
- {
- if(al.contains(array[i]))
- al.remove(new Integer(array[i]));
- else
- al.add(array[i]);
- }
- num1[0]=al.get(0);
- num2[0]=al.get(1);
- }
- }
---------------------------------------------------------------------------------------------------------------------------------------------------
301小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。
但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。
现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
- import java.util.ArrayList;
- /*
- *初始化small=1,big=2;
- *small到big序列和小于sum,big++;大于sum,small++;
- *当small增加到(1+sum)/2是停止
- */
- public class Solution {
- public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
- ArrayList<ArrayList<Integer> >lists=new ArrayList<ArrayList<Integer> >();
- if(sum<=1)
- return lists;
- int small=1;
- int big=2;
- while(small!=(1+sum)/2){
- int curSum=sumOfList(small,big);
- if(curSum==sum)
- {
- ArrayList<Integer>list=new ArrayList<Integer>();
- for(int i=small;i<=big;i++)
- list.add(i);
- lists.add(list);
- small++; //不能忘记符合条件时对数据的增加
- big++;
- }
- else if(curSum<sum)
- {
- big++;
- }else
- {
- small++;
- }
- }
- return lists;
- }
- private int sumOfList(int start,int end){
- int sum=0;
- for(int i=start;i<=end;i++){
- sum+=i;
- }
- return sum;
- }
- }
--法二
- //根据数学公式计算:(a1+an)*n/2=s n=an-a1+1
- //(an+a1)*(an-a1+1)=2*s=k*l(k>l)
- //an=(k+l-1)/2 a1=(k-l+1)/2
- import java.util.ArrayList;
- public class Solution {
- public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
- ArrayList<ArrayList<Integer>>list=new ArrayList<ArrayList<Integer>>();
- if(sum<3)return list;
- int s=(int) Math.sqrt(2*sum);
- for(int i=s;i>=2;i--)
- {
- if(2*sum%i==0)
- {
- int d=2*sum/i;
- if(d%2==0&&i%2!=0||d%2!=0&&i%2==0)
- {
- int a1=(d-i+1)/2;
- int an=(d+i-1)/2;
- ArrayList<Integer>temp=new ArrayList<Integer>();
- for(int j=a1;j<=an;j++)
- temp.add(j);
- list.add(temp);
- }
- }
- }
- return list;
- }
- }
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。
对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,
即“XYZdefabc”。是不是很简单?OK,搞定它!
- public class Solution {
- public String LeftRotateString(String str,int n) {
- int len=str.length();
- if(len == 0)
- return "";
- str+=str;
- return str.substring(n, n+len);
- }
- }
---------------------------------------------------------------------------------------------------------------------------------------
一个链表中包含环,请找出该链表的环的入口结点。
第一步,找环中相汇点。分别用p1,p2指向链表头部,p1每次走一步,p2每次走二步,直到p1==p2找到在环中的相汇点。
第二步,找环的入口。接上步,当p1==p2时,p2所经过节点数为2x,p1所经过节点数为x,设环中有n个节点,p2比p1多走一圈有2x=n+x;
n=x;可以看出p1实际走了一个环的步数,再让p2指向链表头部,p1位置不变,p1,p2每次走一步直到p1==p2; 此时p1指向环的入口。
- public class Solution {
- ListNode EntryNodeOfLoop(ListNode pHead){
- if(pHead == null || pHead.next == null)
- return null;
- ListNode p1 = pHead;
- ListNode p2 = pHead;
- while(p2 != null && p2.next != null ){
- p1 = p1.next;
- p2 = p2.next.next;
- if(p1 == p2){
- p2 = pHead;
- while(p1 != p2){
- p1 = p1.next;
- p2 = p2.next;
- }
- if(p1 == p2)
- return p1;
- }
- }
- return null;
- }
- }
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
- public class Solution {
- boolean isSymmetrical(TreeNode pRoot)
- {
- if(pRoot==null)
- return true;
- return isSymmetrical(pRoot.left, pRoot.right);
- }
- private boolean isSymmetrical(TreeNode left, TreeNode right)
- {
- if(left==null&&right==null)
- return true;
- if(left==null||right==null)
- return false;
- if(left.val==right.val)
- return isSymmetrical(left.left, right.right)&&isSymmetrical(left.right, right.left);
- return false;
- }
- }
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
- import java.util.ArrayList;
- import java.util.Stack;
- public class Solution {
- ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
- ArrayList<ArrayList<Integer>>res=new ArrayList<ArrayList<Integer>>();
- ArrayList<Integer>tmp=new ArrayList<Integer>();
- if(pRoot==null)
- return res;
- Stack<TreeNode>list1=new Stack<TreeNode>();
- Stack<TreeNode>list2=new Stack<TreeNode>();
- list1.push(pRoot);
- while(!list1.empty()||!list2.empty())
- {
- if(!list1.empty())
- {
- while(!list1.empty())
- {
- TreeNode p=list1.pop();
- tmp.add(p.val);
- if(p.left!=null)
- list2.add(p.left);
- if(p.right!=null)
- list2.add(p.right);
- }
- res.add(new ArrayList<Integer>(tmp));
- tmp.clear();
- }
- if(!list2.empty())
- {
- while(!list2.empty())
- {
- TreeNode p=list2.pop();
- tmp.add(p.val);
- if(p.right!=null)
- list1.add(p.right);
- if(p.left!=null)
- list1.add(p.left);
- }
- res.add(new ArrayList<Integer>(tmp));
- tmp.clear();
- }
- }
- return res;
- }
- }
-----------------------------------------------------------------------------------------------------------------------------------------------------------
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行
- import java.util.ArrayList;
- import java.util.LinkedList;
- public class Solution {
- ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
- ArrayList<ArrayList<Integer> >res=new ArrayList<ArrayList<Integer> >();
- ArrayList<Integer>tmp=new ArrayList<Integer>();
- LinkedList<TreeNode> q = new LinkedList<TreeNode>();
- if(pRoot==null)
- return res;
- q.add(pRoot);
- int now=1,next=0;
- while(!q.isEmpty())
- {
- TreeNode t=q.remove();
- now--;
- tmp.add(t.val);
- if(t.left!=null)
- {
- q.add(t.left);
- next++;
- }
- if(t.right!=null)
- {
- q.add(t.right);
- next++;
- }
- if(now==0)
- {
- res.add(new ArrayList<Integer>(tmp));
- tmp.clear();
- now=next;
- next=0;
- }
- }
- return res;
- }
- }
--------------------------------------------------------------------------------------------------------------------------------
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
- public class Solution {
- TreeNode KthNode(TreeNode pRoot, int k)
- {
- if(k<=0||pRoot==null)
- return null;
- Stack<TreeNode>LDRstack=new Stack<TreeNode>();
- TreeNode p=pRoot;
- TreeNode res=null;
- int count=0;
- while(p!=null||!LDRstack.isEmpty())
- {
- while(p!=null)
- {
- LDRstack.push(p);
- p=p.left;
- }
- TreeNode p1=LDRstack.pop();
- count++;
- if(count==k)
- res=p1;
- p=p1.right;
- }
- return res;
- }
- }