目录
二叉树
二叉树是一棵树,它的每个节点最多有两个孩子。如下都是二叉树,其中中间是满二叉树(每层都填满了,除了最后一层每层都有两个孩子),最右边是完全二叉树(前n-1层都填满了,最后一层从左到右挨个填的,可以不填满)
二叉树的遍历
二叉树的遍历一共有三种方式:
1. 前序遍历:根节点—左孩子—右孩子
2. 中序遍历:左孩子—根节点—右孩子
3. 后序遍历:左孩子—右孩子—根节点
以上图的第二幅图为例:
前序遍历:ABDECFG
中序遍历:DBEAFCG
后序遍历:DEBFGCA
二叉树的建立和遍历的实现(前序)
#include<iostream>
#include<cstring>
using namespace std;
//节点定义
typedef struct Node{
int element = 0;
Node *left = NULL;
Node *right = NULL;
}Node;
//二叉树的建立(前序建立),前序后序只需修改代码顺序
Node * create(){
Node *N = NULL;
int element ;
cin>>element;
if(element != 0){
N = new Node;
N->element = element;
N->left = create();
N->right = create();
}
return N;
}
//二叉树的遍历(前序遍历)
void travel(Node * root){
cout<<root->element<<endl;
if(root->left!=NULL)
travel(root->left);
if(root->right!=NULL)
travel(root->right);
}
int main(){
Node * root;
root = create();
travel(root);
return 0;
}
二叉查找树
对于树中的每个节点,左子树所有节点的值 < 根节点的值 < 右子树所有节点的值,例如
而下图就不是二叉查找树,因为19比18大,但是19在18的左子树上
查找树的操作除了上述的创建和遍历,还包括有查找节点,删除节点,插入节点,找最小值等。
查找节点
//查找某个值,返回node
Node *find_node(Node *root,int num){
while(1){
if(root->element == num)
return root;
else if(root->element>num){
if(root->left == NULL)
return NULL;
root = root->left;
}
else{
if(root->right == NULL)
return NULL;
root = root->right;
}
}
}
插入节点
插入节点分为递归和非递归的方式
//递归的方式
void insert(Node *root ,int num){
Node *N = new Node;
N->element = num;
if(root->element>num){
if(root->left ==