数据结构——二叉树的遍历与创建

二叉树的特点

  • 每个结点最多只有两棵子树,不存在度数大于2的节点
  • 二叉树是有序的,其次序不能任意颠倒

斜树

- 所有节点都只有左子树的称为左斜树;
  • 所有节点都只有右子树的称为右斜树;

  • 在斜树中,每一层只有一个结点 , 斜树的结点个数==深度

满二叉树

- 在一棵二叉树中,如果所有分支节点都存在左子树和右子树,并且所有**叶子都在同一层上**,这样的二叉树被称为满二叉树。

完全二叉树

  • 对于具有n个节点的二叉树按层序编号,如果编号为i的节点与同样深度的满二叉树的编号为i的结点在二叉树中的位置相同,则这棵树是完全二叉树
  • 叶子结点只能出现在最下面的两层,且最下层的叶子结点都集中在二叉树的左侧。
  • 如果有度数为1的结点,只可能有一个,且该结点只有左孩子。

二叉树的五条基本性质

  • 二叉树的第i层上最多有 2i-1 个结点

  • 一棵深度为k的二叉树中,最多有2k-1个结点(完全二叉树),最少有k个(斜树)

  • 在一棵二叉树中,如果叶子结点的个数为n0,度数为2的结点的个数为n2,则n0 = n2 + 1。

  • 具有n个结点的完全二叉树的深度为log2 n+1(取最小整数)。

二叉树的建立
struct Node {
	Node* lchild;
	Node* rchild;
	char value;
};
Node* createBinaryTree(Node* node){
	char ch;
	cin >> ch;
	if (ch == '#')
		node = NULL;
	else {
		node = new Node;
		node->value = ch;
		node->lchild = createBinaryTree(node->lchild);
		node->rchild = createBinaryTree(node->rchild);
	}
	return node;
}
前序,后序,中序,层序遍历
void preOrder(Node* node) {
	if (node != NULL) {
		cout << node->value << " ";
		preOrder(node->lchild);
		preOrder(node->rchild);
	}
}
void postOrder(Node* node) {
	if (node != NULL) {
		postOrder(node->lchild);
		postOrder(node->rchild);
		cout << node->value << " ";
	}
}
void inOrder(Node* node) {
	if (node != NULL) {
		inOrder(node->lchild);
		cout << node->value << " ";
		inOrder(node->rchild);
	}
}
void leverOrder(Node* node) {
	if (node != NULL)
	{	
		int front = -1, rear = -1;
		Node* Q[10];
		Q[++rear] = node;//入队
		while (rear != front) {
			Node* n = Q[++front];//出队
			cout << n->value;
			if (n->lchild != NULL) Q[++rear] = n->lchild;//不为空,则入队
			if (n->rchild != NULL) Q[++rear] = n->rchild;
		}

	}
}
销毁
void deleteBinaryTree(Node*node) {
	if (node != NULL)
	{
		deleteBinaryTree(node->lchild);
		deleteBinaryTree(node->rchild);
		delete(node);
	}
}

哈弗曼树,树与森林之间的相互转换都是树中很重要的内容。

猜你喜欢

转载自blog.csdn.net/qq_41374768/article/details/88829536