题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。 如下图所示:右边的二叉树就是左边的树的镜像。我们可以根据照镜子的经验画出它的镜像。递归思想:这两棵树的根节点相同,但是他们的左右孩子交换了。首先,我们交换根节点的两个孩子,然后递归的处理根节点孩子的孩子。代码如下:
非递归的思想:我们按照广度遍历二叉树的顺序,逐个处理遍历的节点。当处理的当前节点,如果有孩子节点,我们交换它们的孩子节点,并且把它们的非空孩子入队列。处理完当前节点以后,我们下一次处理队头的节点。void mirror01(BinaryTreeNode *root) { if(root == NULL)//处理的当前节点为空 return; if(root->left == NULL && root->right == NULL)//处理叶子节点 return; swap(root->left,root->right);//交换左右孩子 if(root->left != NULL)//进入左孩子 mirror01(root->left); if(root->right != NULL)//进入右孩子 mirror01(root->right); }
非递归思想:我们也可以按照先序遍历二叉树的顺序,非递归的实现二叉树的镜像操作,每遇到一个节点,判断当前节点是否有孩子,如果有孩子,我们交换其左右孩子,然后把非空孩子入栈。直到队列为空。void mirror01(BinaryTreeNode *&root) { queue<BinaryTreeNode *> q; BinaryTreeNode *pointer = root;//当前处理的节点为根节点 while (pointer) { swap(pointer->left, pointer->right);//交换当前处理节点的孩子 if (pointer->left)//左孩子不为空 q.push(pointer->left); if (pointer->right)//右孩子不为空 q.push(pointer->right); if (!q.empty()) { pointer = q.front(); q.pop(); } else { break; } } }
void mirror02(BinaryTreeNode *root) { if (root == NULL)//如果处理的空树,我们直接返回 return; stack<BinaryTreeNode*> s;//创建一个栈 s.push(root); BinaryTreeNode *pointer = NULL; while (!s.empty()) { pointer = s.top();//取出栈顶元素 s.pop(); if (pointer->left != NULL || pointer->right != NULL)//非叶子节点 { swap(pointer->left,pointer->right);//交换其左右孩子 } if (pointer->left != NULL)//非空左子树入栈 s.push(pointer->left); if (pointer->right != NULL)//非空右子树入栈 s.push(pointer->right); } }
二叉树镜像(递归与非递归)
最新推荐文章于 2023-01-09 22:09:44 发布