1.Stack(先进后出)LIFO
只能在栈顶进行元素的插入和删除;
顺序栈
内部有一个ArrayList作为储存器,p_Index永远指向栈顶;
Push入栈
Pop出栈
Top(peek)
return list[p_Index];
复杂度:
- 当内部list容量够用时,不需要增大容量的情况下,入栈Push为O(1),反之为O(n);
- 出栈始终为O(1);
链栈
实质上是一种单链表,但只能在链表一个位置插入和删除;
Push
newNode.Next=top;
top=newNode;
Pop
top.next=top;
2.Queue(先进先出)FIFO
只能在队列的队头Head删除,在队尾Tail插入;
顺序队列
内部ArrayList作为储存器,当队列容量不够时,长度双倍增长;
EnQueue入队列
list.Add(item);
UnQueue出队列
list.RemoveAt(0);
/// 泛型顺序队列
class MyQueue<T>
{
List<T> list;
public MyQueue()
{
list = new List<T>();
}
//入队
public void EnQueue(T item)
{
list.Add(item);
}
//出队
public void UnQueue()
{
if(list.Count>0)
list.RemoveAt(0);
}
}
链队(待更新)
3.二叉树
子节点最多2个;
二叉查找树:左结点小,右结点大;
深度遍历:
public void PreOrder(Node root) //先序(中左右)
{
if(!root==null)
{
Console.WirteLine(root);
PreOrder(root.left);
PreOrder(root.right);
}
}
public void InOrder(Node root) //中序(左中右)
{
if(!root==null)
{
InOrder(root.left);
Console.WirteLine(root);
InOrder(root.right);
}
}
public void PostOrder(Node root) //后序(左右中)
{
if(!root==null)
{
PostOrder(root.left);
PostOrder(root.right);
Console.WirteLine(root);
}
}
给树求遍历顺序
先序:ABDGEHCF
中序:GDBEHACF
后序:GDHEBFCA
知道两序求另外一序(必须知道中序)
知道中序和另外一序可以确定根结点A;
分成两段之后,再找出根结点B;
一直分段,就可以画出树,从而得出后序;