树的代码
创建节点
#include <stdio.h>
#include <stdlib.h>
//定义节点
struct node{
int data;
struct node* left;
struct node* right;
}Node;
//先序遍历 传入根节点
void preorder(Node* node)
{
//根左右
if(node!=NULL){
//node 是一个指针
printf("%d",node->data);
preorder(node->left);
preorder(node->right);
}
}
//中序遍历
void inorder(Node* node)
{
//左根右
if(node!=NULL){
//node 是一个指针
inorder(node->left);
printf("%d\n",node->data);
inorder(node->right);
}
}
//后续左右根
int main()
{
Node n1;
Node n2;
Node n3;
Node n4;
n1.data=5;
n2.data=6;
n3.data=7;
n4.data=8;
//n2是一个实体 n1.left是一个指针
n1.left=&n2;
n1.right=&n3;
n2.left=&n4;
n2.right=NULL;
n2.left=NULL;
n3.right=NULL;
n4.left=NULL;
n4.right=NULL;
//参数是指针 所以传入地址
preorder(&n1);
}
如果我要很多节点呢? 要动态建树
6 3 8 2 5 1 7
建树
右>根>左
这是一个搜索过程
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node* left;
struct node* right;
}Node;
typedef struct{
Node* root;
}Tree;
//先序遍历 传入根节点
void preorder(Node* node)
{
//根左右
if(node!=NULL){
//node 是一个指针
printf("%d",node->data);
preorder(node->left);
preorder(node->right);
}
}
//中序遍历
void inorder(Node* node)
{
//左根右 指针指向左节点同时打印左节点 打印根节点 指针指向右节点同时打印右节点
if(node!=NULL){
//node 是一个指针
inorder(node->left);
printf("%d\n",node->data);
inorder(node->right);
}
}
void insert(Tree* tree,int value){
//建立新节点
Node* node=melloc(sizeof(Node));
node->data=value;
node->left=NULL;
node->right=NULL;
//如果树的根节点为空 就将第一个节点变为根节点
if(tree->root==NULL)
{
tree->root=node;
}else{
//临时节点 一开始为树根 当前比较的节点
Node* temp=tree->root;
while(temp!=NULL)
{
if(value<temp->data)//走左边
{
if(temp->left==NULL)
{
temp->left=node;
return;
}else{
temp=temp->left;
}
}
else{
if(temp->right==NULL)
{
temp->right=node;
return;
}else{
temp=temp->right;
}
}
}
}
int main(){
int arr[7]={6,3,8,2,5,1,7};
Tree tree;
tree.root=NULL;
int i;
for(i=0;i<7;i++)
{
insert(&tree,arr[i]);
}
preorder(tree.root);
}
}
假如知道 左子树高度是三 右边是二 我们只看左边就ok 左子树+1即全部高度
- 知道左边高度
- 右边高度
递归
int get_height(Node* node)
{
//递归出口
if(node==NULL)
{
return 0;
}
else{
int left_h=get_height(node->left);
int right_h=get_height(node->right);
int max=left_h;
if(right_h>max)
{
max=right_h;
}
return max+1;
}
}
求最大值
- 找左边的最大值
- 右边最大值
递归
int get_maximin(Node* node)
{
//递归出口
if(node==NULL)
{
return -1;//没有节点
}
else{
int m1=get_maximin(node->left);
int m2=get_maximin(node->right);
int m3=node->data;
int max=m1
if(max<m2){max=m2;}
if(max<m3){max=m3;}
return max;
}
}
1+1=2
1+2=3
2+3=5
递归关系如下
时间复杂度:o(2^n)
重叠组问题 fib(4)重复 在左边保留一份fib(5) 先保存起来 等到要继续用的时候就不用重复计算
先按结束时间排序 只考虑前面的
4 1 1 9 1
选不相邻数字