三种排序的遍历
typedef char BTDataType; typedef struct BinaryTreeNode { BTDataType _data; struct BinaryTreeNode* _left; struct BinaryTreeNode* _right; }BTNode; BTNode* BuyNode(BTDataType x) { BTNode* node = malloc(sizeof(BTNode)); node->_data = x; node->_left = NULL; node->_right = NULL; return node; } //构造 BTNode* CreatBinaryTree() { BTNode* node1 = BuyNode('A'); BTNode* node2 = BuyNode('B'); BTNode* node3 = BuyNode('C'); BTNode* node4 = BuyNode('D'); BTNode* node5 = BuyNode('E'); BTNode* node6 = BuyNode('F'); node1->_left = node2; node1->_right = node3; node2->_left = node4; node3->_left = node5; node3->_right = node6; return node1; } //前序遍历 void PreOrder(BTNode* root) { if (root == NULL) { printf("NULL "); return; } printf("%c ", root->_data); PreOrder(root->_left); PreOrder(root->_right); } // 二叉树中序遍历 void InOrder(BTNode* root) { if (root == NULL) { printf("NULL "); return; } InOrder(root->_left); printf("%c ", root->_data); InOrder(root->_right); } // 二叉树后序遍历 void PostOrder(BTNode* root) { if (root == NULL) { printf("NULL "); return; } PostOrder(root->_left); PostOrder(root->_right); printf("%c ", root->_data); } void TestTree() { BTNode* root = CreatBinaryTree(); PreOrder(root); printf("\n"); InOrder(root); printf("\n"); PostOrder(root); } int main() { //TestHeap(); // TestTopk(); TestTree(); return 0; }
#include<stdio.h> #include<stdlib.h> typedef char BTDataType; typedef struct BinaryTreeNode { BTDataType data; struct BinaryTreeNode* left; struct BinaryTreeNode* right; }BTNode; //创建节点 BTNode* BuyNode(BTDataType x) { BTNode* node = (BTNode*)malloc(sizeof(BTNode)); node->data = x; node->left = NULL; node->right = NULL; return node; } //创建树 BTNode* CreatBinaryTree() { BTNode* node1 = BuyNode('A'); BTNode* node2 = BuyNode('B'); BTNode* node3 = BuyNode('C'); BTNode* node4 = BuyNode('D'); BTNode* node5 = BuyNode('E'); BTNode* node6 = BuyNode('F'); BTNode* node7 = BuyNode('G'); node1->left = node2; node1->right = node3; node2->left = node4; node3->left = node5; node3->right = node6; node4->left = node7; return node1; } // 二叉树节点个数 // 1、遍历 -- 全局变量 //int size = 0; //void BinaryTreeSize(BTNode* root) //{ // if (root == NULL) // return; // else // ++size; // // BinaryTreeSize(root->left); // BinaryTreeSize(root->right); //} // 2、遍历 -- 局部变量 //void BinaryTreeSize(BTNode* root, int* psize) //{ // if (root == NULL) // return; // else // ++(*psize); // // BinaryTreeSize(root->left, psize); // BinaryTreeSize(root->right, psize); //} // 3、分治 int BinaryTreeSize(BTNode* root) { return root == NULL ? 0 : 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right); } // 二叉树叶子节点个数 int BinaryTreeLeafSize(BTNode* root) { if (root == NULL) { return 0; } else if (root->left == NULL && root->right == NULL) { return 1; } else { return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right); } } // 二叉树第k层节点个数 int BinaryTreeLevelKSize(BTNode* root, int k) { if (root == NULL) return 0; if (k == 1) return 1; return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1); } // 二叉树深度/高度 int BinaryTreeDepth(BTNode* root) { if (root == NULL) { return 0; } int leftDepth = BinaryTreeDepth(root->left); int rightDepth = BinaryTreeDepth(root->right); return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1; } //BTNode* BinaryTreeFind(BTNode* root, BTDataType x) //{ // if (root == NULL) // { // return NULL; // } // // if (root->data == x) // { // return root; // } // //要是编译不过的话,要把BTNode换为struct BinaryTreeNode // BTNode* left = BinaryTreeFind(root->left, x); // if (left) // return left; // BTNode* right = BinaryTreeFind(root->right, x); // return right; //} //二叉树查找值为x的节点 //BTNode* BinaryTreeFind(BTNode* root, BTDataType x) //{ // if (root == NULL) // return NULL; // // if (root->data == x) // return root; // // BTNode* retLeft = BinaryTreeFind(root->left, x); // if (retLeft) // { // return retLeft; // } // //左边没找到才到右边找 // BTNode* retRight = BinaryTreeFind(root->right, x); // if (retRight) // { // return retRight; // } // // return NULL;//左右树都没找到返回空 // // //return BinaryTreeFind(root->right, x); //} int main() { //全局变量算节点个数应注意的点 //因为size为全局变量所以算两次节点的个数的时候需要重复令size为0 //不然第二次算的节点树会是两倍(累加) /*BTNode* root = CreatBinaryTree(); int size1 = 0; BinaryTreeSize(root, size1); printf("BinaryTreeSize:%d\n", size1); int size2 = 0; BinaryTreeSize(root, size2); printf("BinaryTreeSize:%d\n", size2); PreOrder(root);*/ //局部变量算节点个数应注意的点 //局部变量传的时候要传指而不是传值 //传值的时候通过算的size为0来算出 /*BTNode* root = CreatBinaryTree(); int size1 = 0; BinaryTreeSize(root, &size1); printf("BinaryTreeSize:%d\n", size1); int size2 = 0; BinaryTreeSize(root, &size2); printf("BinaryTreeSize:%d\n", size2); PreOrder(root);*/ //分治算节点个数 //和递归比较--分治带返回值 BTNode* root = CreatBinaryTree(); printf("BinaryTreeSize:%d\n", BinaryTreeSize(root)); printf("BinaryTreeSize:%d\n", BinaryTreeSize(root)); printf("BinaryTreeLeafSize:%d\n", BinaryTreeLeafSize(root)); printf("BinaryTreeLevelKSize:%d\n", BinaryTreeLevelKSize(root, 3)); printf("BinaryTreeDepth:%d\n", BinaryTreeDepth(root)); /*BTNode* ret = BinaryTreeFind(root, 'V'); if (ret) { printf("找到了\n"); } else { printf("没有找到\n"); }*/ return 0; }
第k层节点的个数