二叉树的代码动态规划

树的代码

创建节点

在这里插入图片描述

#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即全部高度

  1. 知道左边高度
  2. 右边高度

递归

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;
	}
}

求最大值

  1. 找左边的最大值
  2. 右边最大值

递归

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

选不相邻数字

原创文章 159 获赞 4 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44769592/article/details/101116977