每日算法题【二叉树】:二叉树查找值为x的节点、给定字符串用前序遍历构建二叉树、二叉树的销毁
(19)二叉树查找值为x的节点
-
解题思路:
使用前序遍历整个二叉树,比较根节点是否为x,不为x就递下去判断左右子节点是否为x
BTNode* TreeFind(BTNode* root,BTDataType x){//递归结束条件if(root == NULL){return NULL;}//判断根节点是否为xif(root->val == x){return root;}//通过变量来保存左右子树递归回来的结果进行判断BTNode* ret1 = TreeFind(root->left);if(ret1){return ret1};BTNode* ret2 = TreeFind(root->right);if(ret2){return ret2};//如果左右子树也没找到X就直接返回NULLreturn NULL; }
(20) 给定字符串用前序遍历构建二叉树
-
解题思路:
用前序遍历字符串,将经过的节点(字符)都申请到空间,然后将值放到二叉树中,并接着向下递,直到遇到空节点(字符#)结束递归
BTNode* CreateTree(char* a,int* index){//遇到空节点结束递归if(a[*index] == '#'){(*index)++;return NULL;}//遇到非空节点申请空间并将值放入到二叉树中BTNode* root = (BTNode*)malloc(sizeof(BTNode));root->val = a[(*index)++];root->left = CreateTree(a,index);root->right = CreateTree(a,index);//左右子树都构建完毕之后返回根节点return root; }
(21)二叉树销毁
-
解题思路:
二叉树的销毁一定要用后序遍历,以免先销毁根节点从而找不到左右子树了
void TreeDestory(BTNode* root){ if(root == NULL){return ; } TreeDestory(root->left); TreeDestory(root->right); free(root); }