Java面试宝典:MongoDB实战技巧 作者:忆遂愿
https://cloud.tencent.com/developer/article/2466159?shareByChannel=link
文章对 MongoDB 知识的全面阐述,质量很高。从基本概念、Java 驱动使用、数据操作、安全性能问题与解决、数据一致性事务处理,到数据模型设计、技术集成和存储图片优势等方面讲解详细、条理清晰,体现出作者深入的理解。
二叉树有三种遍历方式,三种遍历方式的核心都是把一颗二叉树分为根、左子树、右子树三部分。前中后其实说的是根出现的顺序,在二叉树中左子树遍历顺序始终先于右子树。
以这个二叉树为例讲解,一颗二叉树分为根、左子树、右子树。空树是最小单位已经不能再分
最先分为根1、 根1的左子树、根1的右子树
根1的左子树又可以分为 根2、根2的左子树、根2的右子树(为空树)
根1的右子树又可以分为 根4、根4的左子树、根4的右子树
根2的左子树又可以分为根3 、根3的左子树(为空树)、根3的右子树(为空树)
根2的右子树是空树是最小单位已经不能再分了
根4的左子树又可以分为根5 、根5的左子树(为空树)、根5的右子树(为空树)
根4的右子树又可以分为根6 、根6的左子树(为空树)、根6的右子树(为空树)
如下图
温馨提示:空树用N来表示
根-> 左子树 ->右子树
根1-> 根2(1的左子树) -> 根3(2的左子树)-> N(3的左子树)-> N(3的右子树)
根1-> 根2(1的左子树) -> 根3(2的左子树)-> N(3的左子树)-> N(3的右子树)->N(2的右子树)
根1-> 根2(1的左子树) -> 根3(2的左子树)-> N(3的左子树)-> N(3的右子树)->N(2的右子树)->根4(1的右子树)->根5(4的左子树)->N(5的左子树)->N(5的右子树)
根1-> 根2(1的左子树) -> 根3(2的左子树)-> N(3的左子树)-> N(3的右子树)->N(2的右子树)->根4(1的右子树)->根5(4的左子树)->N(5的左子树)->N(5的右子树)->根6(4的右子树)->N(6的左子树)->N(6的右子树)
左子树-> 根-> 右子树
(根1的左子树)->(根2的左子树)->N(根3的左子树)->根3->N(根3的右子树)
(根1的左子树)->(根2的左子树)->N(根3的左子树)->根3->N(根3的右子树)->根2->N(2的右子树)
(根1的左子树)->(根2的左子树)->N(根3的左子树)->根3->N(根3的右子树)->根2->N(2的右子树)->根1->(根4的左子树)->N(根5的左子树)->根5->N(根5的右子树)
(根1的左子树)->(根2的左子树)->N(根3的左子树)->根3->N(根3的右子树)->根2->N(2的右子树)->根1->(根4的左子树)->N(根5的左子树)->根5->N(根5的右子树)->根4->N(根6的左子树)->根6->N(根6的右子树)
左子树-> 右子树-> 根
大家可以自行遍历,这里给个参考结果
结果:N N 3 N 2 N N 5 N N 6 4 1
定义一个二叉树的结构体,里面包含左子树指针,右子树指针,数据
先造一棵链式二叉树出来
先造一棵链式二叉树出来
#include<stdio.h>
#include<stdlib.h>
typedef int BTDataType;
typedef struct BinaryTreeNode
{
BTDataType data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}BTNode;
BTNode* BuyNode(BTDataType x)
{
BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
if (newnode == NULL)
{
perror("malloc fail");
return NULL;
}
newnode->left = newnode->right = NULL;
newnode->data = x;
return newnode;
}
BTNode* CreatBinaryTree()
{
BTNode* node1 = BuyNode(1);
BTNode* node2 = BuyNode(2);
BTNode* node3 = BuyNode(3);
BTNode* node4 = BuyNode(4);
BTNode* node5 = BuyNode(5);
BTNode* node6 = BuyNode(6);
node1->left = node2;
node1->right = node4;
node2->left = node3;
node4->left = node5;
node4->right = node6;
return node1;
}
// 二叉树前序遍历
void PreOrder(BTNode* root)
{
if (root == NULL)
{
printf("N ");
return;
}
printf("%d ", root->data);
PreOrder(root->left);
PreOrder(root->right);
}
// 二叉树中序遍历
void InOrder(BTNode* root)
{
if (root == NULL)
{
printf("N ");
return;
}
InOrder(root->left);
printf("%d ", root->data);
InOrder(root->right);
}
// 二叉树后序遍历
void PostOrder(BTNode* root)
{
if (root == NULL)
{
printf("N ");
return;
}
PostOrder(root->left);
PostOrder(root->right);
printf("%d ", root->data);
}
int main()
{
BTNode* root = CreatBinaryTree();
PreOrder(root);
printf("\n");
InOrder(root);
printf("\n");
PostOrder(root);
}
以前序为例理解递归
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。