二叉树:镜像树,子结构,二叉树转链表,二叉树的倒数K个数,对称,Z型打印

1.把一棵二叉树转换为它的镜像树。

c 复制代码
void mirror_tree(TreeNode *root)
{
	if(root==NULL) return ;
	TreeNode *temp=root->right;
		root->right=root->left;
		root->left=temp;
		mirror_tree(root->right);
		mirror_tree(root->left);

}

2、输入两棵二叉树A,B,判断B是不是A的子结构(我们约定空树不是任意一个树的子结构)。

c 复制代码
bool _is_zi(TreeNode *s1,TreeNode *s2)
{
	if(s1==NULL &&s2==NULL) return true;
	if(s1!=NULL&&s2==NULL) return false;
	if(s1==NULL&&s2!=NULL) return false;

	if(s1->date!=s2->data) return false;

	return _is_zi(s1->left,s2->left)&&_is_zi(s1->right,s2->right);
	
}


bool is_zi(TreeNode *root,TreeNode *node)
{
	if(root==NUll ) return false;
	if(root->data==node->data)
	{
	bool a=_is_zi(root,node);
	if(bool) return true;
	}

	bool left=is_zi(root->left,node);
	bool right=is_zi(root->right,node);
	return right||left
}

3、将一棵有序二叉树转换成一个有序的双向链表。

c 复制代码
void *add_tail_node(TreeNode **head,TreeNode *node)
{
	if(*head==NULL)
	{
		*head=node;	
	}
	else
	{
		(*head)->left->right=node;
		node->left=(*head)->left;
	}
	(*head)->left=node;
	
}
void *_tree_to_list(TreeNode *root ,TreeNode **head)
{
		if(root==NULL) return ;
		//中序遍历树
		_tree_to_list(root->let,node);
		 //根结点添加到链表中
		add_tail_node(head,root)
		_tree_to_list(root->right,head);
}
//二插树链表
TreeNode *tree_to_list(TreeNode *root)
{
	//因为不带头结点用,二级指针
	TreeNode *head=NULL;
	_tree_to_list(root->left,&head);
	//最后一个元素的right需要重新指向head
	//而不能在add_tail中让right=head,这样会找不到右子树
	head->left->right=head;
}

4、计算出有序二叉树中倒数第K个大的数。

c 复制代码
bool _access(TreeNode *root, int *k, int index, int *ptr) {  
    if (NULL == root) return false;  
  
    // 递归地访问右子树  
    bool rflag = _access(root->right, k, index, ptr);  
    if (rflag) return true; // 如果右子树中找到了结果,则直接返回  
  
    // 尝试在当前节点上找到结果  
    if ((*k)++ == index) {  
        *ptr = root->data;  
        return true;  
    }  
  
    // 递归地访问左子树  
    return _access(root->left, k, index, ptr);  
}

5、判断一个二叉树是否对称。

c 复制代码
bool _is_sym(TreeNode *root1,TreeNode *root2)
{
	if(root1==NULL&&root2==NULL) return true;
	if(root1==NULL&&root2!==NULL) return false;
	if(root1==!NULL&&root2==NULL) return false;
	if(root1->data!=root2->data) return false;

	bool  lh=_is_sym(root1->left,root2->right);
	bool  rh=_is_sym(root2->right,root2->left);
	return lh&&rh
}
//5.对称
bool is_sym(TreeNode *root)
{
	_is_sym(root,root);	
	
}

6、请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

c 复制代码
//查找某节点
TreeNode *find_node(TreeNode *root, TREE_TYPE data)
{
    if (NULL == root)
    {
        return NULL;
    }

    if (data == root->data)
    {
        return root;
    }

    TreeNode *leftResult = find_node(root->left, data);
    if (leftResult != NULL)
    {
        
        return leftResult;
    }

    TreeNode *rightResult = find_node(root->right, data);
    if (rightResult != NULL)
    {
        return rightResult;
    }

    return NULL;
}


//请实现一个函数按照之字形打印二叉树
void printf_zhi(TreeNode *root)
{
    if (NULL == root) return;

    ListStack *stack1 = create_Link_stack();
    ListStack *stack2 = create_Link_stack();
    push_Link_stack(stack1, root->data); // 将根节点入栈

    bool left_to_right = true; // 标记从左往右打印

    while (!empty_list_stack(stack1) || !empty_list_stack(stack2))
    {
        ListStack *current_stack = left_to_right ? stack1 : stack2;
        ListStack *next_stack = left_to_right ? stack2 : stack1;

        while (!empty_list_stack(current_stack))
        {
            TREE_TYPE data = top_list_stack(current_stack);
            printf("%c ", data);
            pop_List_stack(current_stack);

            TreeNode *current_node = find_node(root, data); // 找到当前节点
            if (current_node != NULL)
            {
                if (left_to_right)
                {
                    if (current_node->left != NULL) push_Link_stack(next_stack, current_node->left->data);
                    if (current_node->right != NULL) push_Link_stack(next_stack, current_node->right->data);
                }
                else
                {
                    if (current_node->right != NULL) push_Link_stack(next_stack, current_node->right->data);
                    if (current_node->left != NULL) push_Link_stack(next_stack, current_node->left->data);
                }
            }
        }

        left_to_right = !left_to_right; // 切换方向
    }
}
相关推荐
小码农<^_^>几秒前
优选算法精品课--滑动窗口算法(一)
算法
羊小猪~~3 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
软工菜鸡28 分钟前
预训练语言模型BERT——PaddleNLP中的预训练模型
大数据·人工智能·深度学习·算法·语言模型·自然语言处理·bert
南宫生31 分钟前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
AI视觉网奇1 小时前
sklearn 安装使用笔记
人工智能·算法·sklearn
JingHongB1 小时前
代码随想录算法训练营Day55 | 图论理论基础、深度优先搜索理论基础、卡玛网 98.所有可达路径、797. 所有可能的路径、广度优先搜索理论基础
算法·深度优先·图论
weixin_432702261 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
小冉在学习1 小时前
day52 图论章节刷题Part04(110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长 )
算法·深度优先·图论
Repeat7151 小时前
图论基础--孤岛系列
算法·深度优先·广度优先·图论基础
小冉在学习1 小时前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论