Invert a binary tree.
4
/ \
2 7
/ \ / \
1 3 6 9
to
4
/ \
7 2
/ \ / \
9 6 3 1
递归算法:
1、交换根节点的左右子树。
2、对左右子树分别执行递归交换 。
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* invertTree(struct TreeNode* root) {
if(NULL == root) return root;
struct TreeNode *lnode, *rnode;
lnode = invertTree(root->right);
rnode = invertTree(root->left);
root->left = lnode;
root->right = rnode;
return root;
}
非递归算法:
1、交换根结点的左右子结点
2、交换第二层及以后各层每个结点的左右子结点,类似于二叉树层次遍历
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct QNode {
struct TreeNode *tmp;
struct QNode *next;
};
struct LinkQueue {
struct QNode *front, *rear;
};
void EnQueue(struct LinkQueue *Q, struct TreeNode *root)
{
struct QNode *s = (struct QNode *)malloc(sizeof(struct QNode));
s->tmp = root;
s->next = NULL;
Q->rear->next = s;
Q->rear = s;
}
//带头结点的队列,Q->front指针指向头结点
void DeQueue(struct LinkQueue *Q)
{
struct QNode *p = Q->front->next;
Q->front->next = p->next;
if(Q->rear == p)
Q->rear = Q->front;
free(p);
}
struct TreeNode* invertTree(struct TreeNode* root)
{
struct LinkQueue *Q = (struct LinkQueue *)malloc(sizeof(struct LinkQueue));
Q->front = (struct QNode *)malloc(sizeof(struct QNode));
Q->rear = Q->front;
if(NULL == root)
return root;
EnQueue(Q, root);
while(Q->front != Q->rear) //当队列为空时,Q->front == Q->rear
{
struct TreeNode *front = Q->front->next->tmp;
DeQueue(Q);
struct TreeNode *tmp = front->left;
front->left = front->right;
front->right = tmp;
if(front->left)
EnQueue(Q, front->left);
if(front->right)
EnQueue(Q, front->right);
}
return root;
}