如何做网站模特,wordpress 文章版本,建网站需要注意的问题,wordpress攻防二叉树
二叉树不能轻易用断言#xff0c;因为树一定有空
二叉树链式结构的实现 在学习二叉树的基本操作前#xff0c;需先要创建一棵二叉树#xff0c;然后才能学习其相关的基本操作。 typedef int BTDataType;
typedef struct BinaryTreeNode
{BTDataType _data;struct B…二叉树
二叉树不能轻易用断言因为树一定有空
二叉树链式结构的实现 在学习二叉树的基本操作前需先要创建一棵二叉树然后才能学习其相关的基本操作。 typedef int BTDataType;
typedef struct BinaryTreeNode
{BTDataType _data;struct BinaryTreeNode* _left;struct BinaryTreeNode* _right;
}BTNode;
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;
} 二叉树的遍历 前序、中序以及后序遍历 1. 前序遍历 (Preorder Traversal 亦称先序遍历 )— 访问根结点的操作发生在遍历其左右子树之前。 2. 中序遍历 (Inorder Traversal)—— 访问根结点的操作发生在遍历其左右子树之中间。 3. 后序遍历 (Postorder Traversal)—— 访问根结点的操作发生在遍历其左右子树之后。 由于被访问的结点必是某子树的根 所以 N(Node 、 L(Left subtree 和 R(Right subtree 又可解释为 根根的左子树和根的右子树 。 NLR 、 LNR 和 LRN 分别又称为先根遍历、中根遍历和后根遍历。 // 二叉树前序遍历
void PreOrder(BTNode* root);
// 二叉树中序遍历
void InOrder(BTNode* root);
// 二叉树后序遍历
void PostOrder(BTNode* root);前序 递归图 中序 递归图 后序同理
#includestdio.h
#includestdlib.h
#includeassert.htypedef int BTDataType;
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;BTNode* BuyNode(BTDataType x)
{BTNode* node (BTNode*)malloc(sizeof(BTNode));if (node NULL){perror(malloc fail);return NULL;}node-data x;node-left NULL;node-right NULL;return node;
}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);BTNode* node7 BuyNode(7);node1-left node2;node1-right node4;node2-left node3;node4-left node5;node4-right node6;node5-left node7;return node1;
}void PrevOrder(BTNode* root)
{if (root NULL){printf(N );return;}printf(%d , root-data);PrevOrder(root-left);PrevOrder(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);
}
层序遍历 层序遍历 除了先序遍历、中序遍历、后序遍历外还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1 层序遍历就是从所在二叉树的根节点出发首先访问第一层的树根节点然后从左到右访问第 2 层上的节点接着是第三层的节点以此类推自上而下自左至右逐层访问树的结点的过程就是层序遍历。 // 层序遍历
void LevelOrder(BTNode* root); 计算二叉树高度 分析 int BTreeHeight(BTNode* root)
{if (root NULL)return 0;int leftHeight BTreeHeight(root-left);int rightHeight BTreeHeight(root-right);return leftHeight rightHeight ? leftHeight 1 : rightHeight 1;
}计算结点个数
1 2递归求结点个数 //int size 0;
//void BTreeSize(BTNode* root)
//{
// if (root NULL)
// return;
//
// size;
//
// BTreeSize(root-left);
// BTreeSize(root-right);
//}int BTreeSize(BTNode* root)
{/*if (root NULL)return 0;return BTreeSize(root-left) BTreeSize(root-right) 1;*/return root NULL ? 0 : BTreeSize(root-left) BTreeSize(root-right) 1;
}
求叶子结点个数 // 求叶子节点的个数
int BTreeLeafSize(BTNode* root)
{if (root NULL){return 0;}if (root-left NULL root-right NULL){return 1;}return BTreeLeafSize(root-left) BTreeLeafSize(root-right);
}
计算第k层结点个数 // 二叉树第k层结点个数
int BTreeLevelKSize(BTNode* root, int k)
{assert(k 0);if (root NULL)return 0;if (k 1)return 1;return BTreeLevelKSize(root-left, k - 1) BTreeLevelKSize(root-right, k - 1);
}