栈、队列和二叉树
栈是什么?
栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作,一般采用顺序表或链表实现。
python实现:python中没有栈,可以用list实现
ls = []
#insert
ls.append(1)
ls.append(2)
ls.append(3)
ls.append(4)
#remove
ls.pop()
#get top
print(ls[-1])
C++实现:stl中默认采用双端队列实现
#include<stack>
stack<int> stk;
//insert
stk.push(1);
stk.push(2);
stk.push(3);
stk.push(4);
//remove
stk.pop();
//get top
cout<< stk.top()<<endl;
队列(queue)是什么?
是一种先进先出的数据结构。
python实现:
ls = []
#insert
ls.append(1)
ls.append(2)
ls.append(3)
ls.append(4)
#remove
ls.pop(0)
#get top
print(ls[0])
C++实现:stl默认实现的双端队列,分段连续空间
#include<deque>
deque<int> q;
//insert
q.push_back(1);
q.push_back(2);
q.push_back(3);
q.push_back(4);
//remove
q.pop_front();
//get top 2
cout << q.front() << endl;
//get tail 4
cout << q.back() << endl;
//get middle 3
cout << q[1] << endl;
注:
C++中队列的特点:
1)在开头或末尾插入、删除元素的时间复杂度为 O(1). 这是它和 vector 的主要区别。
2)随机访问的时间复杂度为 O(1). 这是它和 list 的主要区别。
3)存在劣势:数据结构复杂、排序效率低、内存可能重新分配
二叉树:
二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)
python实现:
#create Node
class Node:
def __init__(self, elem, lchild = None, rchild = None):
self.elem = elem
self.lchild = lchild
self.rchild = rchild
'''
create tree
1
2 3
4 5 6 7
'''
root = Node(1)
root.lchild = Node(2)
root.rchild = Node(3)
temp = root.lchild
temp.lchild = Node(4)
temp.rchild = Node(5)
temp = root.rchild
temp.lchild =Node(6)
temp.rchild =Node(7)
#foreach
def printPre(node):
'''先序遍历:根-左-右'''
if(node == None):
return
print(node.elem,end = ' ')
printPre(node.lchild)
printPre(node.rchild)
printPre(root)
print(end = '\n')
def printMid(node):
'''中序遍历:左-根-右'''
if(node == None):
return
printPre(node.lchild)
print(node.elem,end = ' ')
printPre(node.rchild)
printMid(root)
print(end = '\n')
def printSuf(node):
'''后序遍历:左-右-根'''
if(node == None):
return
printPre(node.lchild)
printPre(node.rchild)
print(node.elem,end = ' ')
printSuf(root)
C++实现:
#include"stdafx.h"
#include<iostream>
using namespace std;
//create Node
struct Node{
int elem;
Node* lchild;
Node* rchild;
Node(int val, Node* left, Node* right) :elem(val), lchild(left), rchild(right){}
};
//前序遍历:根-左-右
void printPre(Node* node){
if (node == nullptr){
return;
}
cout << node->elem << ' ';
printPre(node->lchild);
printPre(node->rchild);
}
//中序遍历:左-根-右
void printMid(Node* node){
if (node == nullptr){
return;
}
printPre(node->lchild);
cout << node->elem << ' ';
printPre(node->rchild);
}
//后序遍历:左-右-根
void printSuf(Node* node){
if (node == nullptr){
return;
}
printPre(node->lchild);
printPre(node->rchild);
cout << node->elem << ' ';
}
int main(){
//create tree
Node* root = new Node(1, nullptr, nullptr);
root->lchild = new Node(2, nullptr, nullptr);
root->rchild = new Node(3, nullptr, nullptr);
Node* temp = root->lchild;
temp->lchild = new Node(4, nullptr, nullptr);
temp->rchild = new Node(5, nullptr, nullptr);
temp = root->rchild;
temp->lchild = new Node(6, nullptr, nullptr);
temp->rchild = new Node(7, nullptr, nullptr);
temp = nullptr;
//foreach
//前序遍历
printPre(root);
cout << endl;
//中序遍历
printMid(root);
cout << endl;
//后序遍历
printSuf(root);
cout << endl;
system("pause");
}
编辑于 2020-08-27 00:25