树、二叉树(完全二叉树、满二叉树)概念图解

1、树的定义

树是n个结点的有限集合,有且仅有一个根结点,其余结点可分为m个根结点的子树。

2、树的概念

  1. 结点的度:一个结点拥有子树的个数称为度。比如A的度为3,C的度为2,H的度为0。度为0的结点称为叶子节点(D,F,G,H)树的度是树中所有结点的度的最大值,此树的度为3。
  2. 树中结点的最大层次成为树的深度或高度。此树的深度为4。
  3. 父节点A的子结点B,C,D;B,C,D也是兄弟节点
  4. 树的集合称为森林.树和森林之间有着密切的关系.删除一个树的根结点,其所有原来的子树都是树,构成森林.用一个结点连接到森林的所有树的根结点就构成树.

 

3、二叉树 

        二叉树是每个节点最多拥有两个子节点,左子树和右子树是有顺序的不能任意颠倒。

 

4、二叉树遍历

前序遍历(前根遍历):——>左——>右

中序遍历(中根遍历):左——>——>右

后序遍历(后根遍历):左——>右——>

已知前序和中序,求后序问题,  前序 ABDGCEFH    中序 DGBAECHF

解法:根据前序、中序综合判断画出树的节点图,然后再写后序遍历:DGBEHFCA

(前序和中序的子树也满足前序或中序的规则)

二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)

      DFS深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止。然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止。利用数据结构“栈”,父节点入栈,父节点出栈,先右子节点入栈,后左子节点入栈。递归遍历全部节点。

DFS:ABDGCEFH

 

     BFS广度优先遍历:从根节点出发,在横向遍历二叉树层段节点的基础上纵向遍历二叉树的层次。利用数据结构“队列”,父节点入队,父节点出队列,先左子节点入队,后右子节点入队。递归遍历全部节点。

BFS:ABCDGEFH

 

5、满二叉树 

高度为h,由2^h-1个节点构成的二叉树称为满二叉树。

 

6、完全二叉树 

完全二叉树是由满二叉树而引出来的,若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数(即1~h-1层为一个满二叉树),第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

堆一般都是用完全二叉树来实现的。

 

未完。。

在C++中,可以使用指针和动态内存分配来建立完全二叉树完全二叉树是一种特殊的二叉树,除了最后一层外,其他层的节点都是满的,并且最后一层的节点都尽量靠左排列。 下面是一个建立完全二叉树的示例代码: ```cpp #include <iostream> #include <queue> using namespace std; // 定义二叉树节点结构 struct TreeNode { int data; TreeNode* left; TreeNode* right; }; // 创建新节点 TreeNode* createNode(int data) { TreeNode* newNode = new TreeNode(); if (!newNode) { cout << "内存分配失败!" << endl; return NULL; } newNode->data = data; newNode->left = newNode->right = NULL; return newNode; } // 建立完全二叉树 TreeNode* createCompleteBinaryTree(int arr[], int size) { if (size == 0) { return NULL; } // 创建根节点 TreeNode* root = createNode(arr[0]); // 使用队列辅助进行层序遍历 queue<TreeNode*> q; q.push(root); // 从数组的第二个元素开始,依次创建节点并连接到二叉树中 for (int i = 1; i < size; i++) { TreeNode* currentNode = q.front(); q.pop(); // 创建左子节点 currentNode->left = createNode(arr[i]); q.push(currentNode->left); // 如果数组还有剩余元素,则创建右子节点 if (i < size - 1) { currentNode->right = createNode(arr[i + 1]); q.push(currentNode->right); i++; // 因为右子节点已经被创建,所以需要跳过下一个元素 } } return root; } // 层序遍历二叉树 void levelOrderTraversal(TreeNode* root) { if (root == NULL) { return; } queue<TreeNode*> q; q.push(root); while (!q.empty()) { TreeNode* currentNode = q.front(); q.pop(); cout << currentNode->data << " "; if (currentNode->left) { q.push(currentNode->left); } if (currentNode->right) { q.push(currentNode->right); } } } int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7}; int size = sizeof(arr) / sizeof(arr[0]); TreeNode* root = createCompleteBinaryTree(arr, size); cout << "完全二叉树的层序遍历结果为:"; levelOrderTraversal(root); return 0; } ``` 这段代码中,我们首先定义了一个`TreeNode`结构体来表示二叉树的节点。然后,我们使用`createNode`函数来创建新的节点,并使用`createCompleteBinaryTree`函数来建立完全二叉树。在`createCompleteBinaryTree`函数中,我们使用队列来辅助进行层序遍历,并依次创建节点并连接到二叉树中。最后,我们使用`levelOrderTraversal`函数来进行层序遍历并输出结果。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值