栈、队列和二叉树

栈、队列和二叉树

栈是什么?

栈数据结构只允许在一端进行操作,因而按照后进先出(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