算法与数据结构-LeetCode-树

1Minimum Depth of Binary Tree最小深度:层序遍历,循环
2binary-tree-postorder-traversal后序遍历:递归
3binary-tree-preorder-traversal先序遍历:递归
4sum-root-to-leaf-numbers遍历,数学,递归
5binary-tree-maximum-path-sum先序遍历,循环,栈
6populating-next-right-pointers-in-each-node-ii层序遍历,循环,队列
7populating-next-right-pointers-in-each-node层序遍历,循环,队列
8path-sum-ii递归,数学计算
9path-sum递归,数学计算
10balanced-binary-tree递归,后序遍历
11binary-tree-level-order-traversal-ii从下往上的层序遍历,循环,栈,ArrayList逆序
12construct-binary-tree-from-inorder-and-postorder-traversal中序遍历+后序遍历 构造二叉树:后序list找根,中序List划分。 递归。
13construct-binary-tree-from-preorder-and-inorder-traversal先序遍历+后序遍历 构造二叉树:前序list找根,中序List划分。 递归。
14maximum-depth-of-binary-tree最大深度
15binary-tree-zigzag-level-order-traversal 层序遍历循环+ArrayList的逆序
16binary-tree-level-order-traversal层序遍历,循环
17symmetric-tree层序遍历(左右)左子树,层序遍历(右左)右子树,直接比较每一个元素
18same-tree先序遍历,递归两棵树。同时比较相同节点的值
19recover-binary-search-tree中性遍历,递归,延续 validate-binary-search-tree,注意交换节点的两种情况,相邻,不相邻
20validate-binary-search-tree中序遍历,递归,法1:先变成List; 法2:直接比较
21unique-binary-search-trees-ii动态规划,递归,延续上题,unique-binary-search-trees
22unique-binary-search-trees动态规划,递归
23binary-tree-inorder-traversal中序遍历,递归

 

1. Minimum Depth of Binary Tree

Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.

思路:层序遍历,循环,队列,每一个for里面就是一层,比较清晰

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.LinkedList;
import java.util.Queue;
 
public class Solution {
    public int run(TreeNode root) {
        if(root==null){
            return 0;
        }
         
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        int depth = 0;
        while(queue.size()!=0){
            depth++;
            int qlength = queue.size();
             
            for(int i=0; i<qlength; i++){
                TreeNode t = queue.poll();
                if(t.left==null && t.right==null){
                    return depth;
                }
                if(t.left!=null && t.right!=null){
                    queue.offer(t.left);
                    queue.offer(t.right);
                }else if(t.left!=null && t.right==null){
                    queue.offer(t.left);
                }else if(t.left==null && t.right!=null){
                    queue.offer(t.right);
                }
            }
        }
        return 0;
    }
}

2. binary-tree-postorder-traversal

Given a binary tree, return the postorder traversal of its nodes' values.

For example:
Given binary tree{1,#,2,3},

   1
    \
     2
    /
   3

return[3,2,1].

Note: Recursive solution is trivial, could you do it iteratively?

后序遍历,递归

import java.util.ArrayList;
  
public class Solution {
      
    public ArrayList<Integer> postorderTraversal(TreeNode root) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(root==null){
            return list;
        }
        postorderRecursive(root,list);
        return list;
    }
    public void postorderRecursive(TreeNode t, ArrayList<Integer> list){
        if(t.left!=null){
            postorderRecursive(t.left, list);
        }
        if(t.right!=null){
            postorderRecursive(t.right, list);
        }
        list.add(t.val);
          
        if(t.left==null && t.right==null){
            return;
        }
    }
}

后序遍历,循环,栈,【trick:前序遍历 根->左->右 变成 根->右->左 结果再reverse一下】

链接:https://www.nowcoder.com/questionTerminal/32af374b322342b68460e6fd2641dd1b
来源:牛客网

import java.util.ArrayList;
import java.util.Stack;
import java.util.Collections;
 
public class Solution {
     
    public ArrayList<Integer> postorderTraversal(TreeNode root) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(root==null){
            return list;
        }
        TreeNode t = root;
        Stack<TreeNode> st = new Stack<TreeNode>();
        while(t!=null || !st.empty()){
            while(t!=null){
                list.add(t.val);
                st.push(t);
                t = t.right;
            }
            if(!st.empty()){
                t = st.pop();
                t = t.left;
            }
        }
        Collections.reverse(list);
        return list;
    }
}

 

顺序存储的线性表 时数 2 性质 验证 内容:1、设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。试设计一算法,将x插入到线性表的适当位置上,以保持线性表的有序性。 2、用向量作存储结构,试设计一个算法,仅用一个辅助结点,实现将线性表中的结点循环右移k位的运算。 3、用向量作存储结构,试设计一个算法,仅用一个辅助结点,实现将线性表逆置的运算。 要求:了解线性表的逻辑结构特征,熟练掌握线性表的顺序存储结构的描述方法,及在其上实现各种基本运算的方法。 单链表上的操作 时数 2 性质 验证 内容:1、已知带头结点的动态单链表L中的结点是按整数值递增排序的,试写一算法将值为x的结点插入到表L中,使L仍然有序。 2、设计一算法,逆置带头结点的动态链表L。要求利用原表的结点空间,并要求用尽可能少的时间完成。 3、假设有两个按元素值递增有序的线性表A和B,均以单链表作存储结构,试编写算法将A表和B表归并成一个按元素值递减有序的线性表C,并要求利用原表的空间存放C。 要求:熟练掌握线性表的单链式链接存储结构及在其上实现线性表的各种基本运算的方法。 循环链表和双链表 时数 2 性质 验证 内容:1、假设在长度大于1的单循环链表中,既无头结点也无头指针。s为指向某个结点的指针,试编写算法删除结点*s的直接前驱结点。 2、已知由单链表表示的线性表中,含有三类字符的数据元素(如:字母、数字和其它字符),设计算法构造三个以循环链表示的线性表,使每一个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的空间。(头结点可以另辟空间) 3、有一双链表,每个结点中除有prior、data和next域外,还有一访问频度域freq,在链表被启用前,其值均初始化为零。每当在链表上进行一次LOCATE(L,x)运算,元素值为x的结点中freq域的值增1,并使此链表中结点保持按freq递减的顺序排列,以便使频繁访问的结点总是靠近表头。设计满足上述要求的LOCATE算法。 要求:熟练掌握线性表的循环链式和双链式链接存储结构及在其上实现线性表的各种基本运算的方法。 栈和队列 时数 2 性质 验证 内容:1、设单链表中存放着n个字符,设计算法,判断该字符串中是否有中心对称关系。例如:xyzzyx、xyzyx都算是中心对称的字符串。 2、设计算法判断一个算术表达式的圆括号是否配对。(提示:对表达式进行扫描,遇‘(’进栈,遇‘)’退掉栈顶的‘(’,表达式被扫描完毕,栈为空) 3、假设以带头结点的循环链表表示队列,并只设一个指针指向队尾,编写相应的置队空、入队和出队算法。 要求:掌握栈和队列的数据结构的特点;熟练掌握在两种存储结构上实现栈和队列的基本运算;学会利用栈和队列解决一些实际问题。 串运算的实现 时数 2 性质 验证 内容:1、若X和Y是用结点大小为1的单链表表示的串,设计算法找出X中第一个不在Y中出现的字符。 2、设计一算法,在顺序串上实现串的比较运算strcmp(S,T)。 3、若S和T是用结点大小为1的单链表存储的两个串,设计算法将S中首次与T匹配的子串逆置。 要求:熟练掌握串的顺序和链接存储结构的实现方法;熟练掌握在两种存储结构上实现串的各种运算。 的应用 时数 2 性质 验证 内容:1、以二叉链表作存储结构,设计求二叉高度的算法。 2、一棵n个结点的完全二叉用向量作存储结构,用非递归算法实现对该二叉进行前序遍历。 3、以二叉链表作存储结构,编写非递归的前序、中序、后序遍历算法。 要求:熟悉二叉的各种存储结构的特点及适用范围;掌握建立二叉的存储结构的方法;熟练掌握二叉的前序、中序、后序遍历的递归及非递归算法;灵活运用递归的遍历算法实现二叉的其它各种运算。
#include #include //#define error 0 //#define OVERFLOW -1 //#define ok 1 #define MAXSIZE 100 typedef char TElemType; typedef int Status; typedef struct BiTNode{ //的结点 TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; typedef BiTree datatype; typedef struct { datatype data[MAXSIZE]; int top; }sqstack; typedef sqstack *STK; Status CreateBiTree(BiTree *T) { //先序建立二叉 char ch; ch=getchar(); if(ch=='#') (*T)=NULL; //#代表空 else { (*T)=(BiTree)malloc(sizeof(BiTNode)); (*T)->data=ch; CreateBiTree(&(*T)->lchild); //先序建立左子 CreateBiTree(&(*T)->rchild); //先序建立右子 } return 1; } STK initstack() //栈的初始化 { STK s; s=(STK)malloc(MAXSIZE*sizeof(sqstack)); s->top=0; return s; //返回指向栈地址的指针 } Status stackempty(STK s) //判断栈是否为空 { return(s->top==0); } Status push(STK s,datatype *e) //压栈函数 { if(s->top==MAXSIZE) //栈满,则返回错误 return 0; else { s->data[s->top]=*e; (s->top)++; return 1; } } Status pop(STK s,datatype *e) //出栈函数 { if(stackempty(s)) //判断栈是否为空 return 0; else { s->top--; *e=s->data[s->top]; //用e接受栈顶元素 return 1; } } Status inordertraverse(BiTree T) //中序非递归遍历二叉 { STK s; s=initstack(); // BiTree T; BiTree p; p=T; while (p||!stackempty(s)) { if(p) { push(s,&p); p=p->lchild; } else { pop(s,&p); printf("%2c",p->data); p=p->rchild; }//else }//while return 1; }//inordertraverse void main() { BiTree T=NULL; printf("\n Creat a Binary Tree .\n"); //建立一棵二叉T* CreateBiTree( &T ); printf ("\nThe preorder is:\n"); inordertraverse(T); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值