【如题】
对一棵二叉树进行反转,即各个节点的左右子树进行反转。
【方法一】非递归
层序遍历:每遍历一个结点,对其左右结点进行交换。
交换根结点的左右子树;
交换第二层结点的左右子树
。。。。。。。
TreeNode* inverse(TreeNode* root){
if(root==NULL)
return NULL;
queue<TreeNode*> que;
que.push(root);
while(!que.empty()){
TreeNode* pNode = que.front();
que.pop();
//比层序遍历多的地方
TreeNode* pLeft = pNode->left;
pNode->left = pNode->rigth;
pNode->right = pLeft;
if(pNode->left != NULL)
que.push(pNode->left);
if(pNode->rigth != NULL)
que.push(pNode->right);
}
return root;
}
【方法二】递归法
步骤:
交换根结点的左右子树
递归调用方法,对左右子树分别调用
TreeNode* inverse(TreeNode* root){
if(root==NULL)
return NULL;
TreeNode* pNode = root->left;
root->left = inverse(root->right);
root->right = inverse(pNode);
return root;
}
【补充】二叉树的层序遍历
void inverse(TreeNode* root){
if(root==NULL)
return;
queue<TreeNode*> que;
que.push(root);
while(!que.empty()){
TreeNode *pNode = que.front();//取得队列首元素
que.pop();//队列首元素出队
printf("%c ",pNode->val);
//判断左右子树是否为空,进行遍历
if(pNode->left != NULL)
que.push(pNode->left);
if(que->right != NULL)
que.push(pNode->right);
}
}