二叉树

  • 节点的度:一个节点含有的子树的个数称为该节点的度
  • 叶节点或终端节点:度为0的节点称为叶节点
  • 非终端节点或分支节点:度不为0的节点
  • 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点
  • 兄弟节点:具有相同父节点的节点互称为兄弟节点
  • 树的度:一棵树中,最大的节点的度称为树的度
  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推
  • 树的高度或深度:树中节点的最大层次
  • 节点的祖先:从根到该节点所经分支上的所有节点

树的定义

typedef struct Node{
	int value;
	struct Node* left;//左孩子,代表整颗左子树
	struct Node* right;//右孩子,代表整颗右子树

}Node;

二叉树

  • 是一颗有序树:左子树不等于右子树时,左右子树互换后该树不相等
  • 满二叉树::一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是
    说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
  • 完全二叉树:效率高;出最后一层之外节点都是满的,最后一层的节点都集中在左侧;不得的出现左为空右有子;

遍历

前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前

void PreorderTraversal(Node* root){
	//空树 root=NULL
	//根  左  右
	if (root == NULL){
		return;
	}
	printf("%d", root->value);
	PreorderTraversal(root->left);
	PreorderTraversal(root->right);
}

中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。

void Inorder(Node* root){
	//左  根  右
	if (root = NULL){
		return;
	}
	Inorder(root->left);
	printf("%d", root->value);
	Inorder(root->right);
}

后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。

void Postorder(Node* root){
	if (root = NULL){
		return;
	}
	Postorder(root->left);
	Postorder(root->right);
	printf("%d",root->value);
}

求结点个数

//求结点个数
//通过遍历(前/中/后),每次经过一个非空结点 ,计算count++
int count=0;
void  Size(Node* root){
	if (root == NULL){
		return;
	}
	count++;
	Size(root->left);
	Size(root->right);
}

求叶子结点个数

int LeafSize(Node* root){
	//空树return 0
	if (root = NULL){
		return 0;
	}
	//一个结点return 1
	if (root->left == NULL&&root->right == NULL){
		return 1;
	}
	int left = LeafSize(root->left);
	int right = LeafSize(root->right);
	return left + right;
}

求树的高度

int GetHeight(Node* root){
	if (root == NULL){
		return 0;
	}
	int left = GetHeight(root->left);
	int right = GetHeight(root->right);
	return (left > right ? left : right)+1;
}

求第K层上的结点个数

int GetKlevel(Node* root, int k){
	if (root == NULL){
		return 0;
	}
	if (k == 1){
		return 1;
	}
    //根的第k层结点个数相当于根的子节点的k-1层
	return GetKlevel(root->left, k - 1) + GetKlevel(root->right,k-1);


}

二叉树查找

Node* Find(Node* root, int v){
	if (root == NULL){
		return NULL;
	}
	//先去根找
	//如果根没找到,左子树
	//左子树没有,右子树
	if (root->value == v){
		return root;
	}
	Node* result = Find(root->left, v);
	if (result){
		//左子树找到了
		return result;
	}
	result = Find(root->right, v);
	if (result){
		return result;
	}
	else return NULL;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值