15. 转换二叉查找树

题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
    8
    / \
 6    10
 /\     /\
5 7 9 11
输出:
      8
     / \
  10   6
   /\    /\
11 9 7 5
定义二元查找树的结点为:
struct BSTreeNode // a node in the binary search tree (BST)
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node

};


HANDWRITING:

first recursion:

void transform(BSTreeNode *root) {
	if (root == 0) return ;
	transform(root->m_pLeft);
	transform(root->m_pRight);
	BSTreeNode *c = root->m_pLeft;
	root->m_pLeft = root->m_pRight;
	root->m_pRight = c;
}

second loop:

void transform (BSTreeNode *root) {
	stack<BSTreeNode *> ;
	s.push(root);
	while (!q.empty()) {
		BSTreeNode *c = q.top();
		q.pop();
		q.push(c->m_pRight), q.push(c->m_pLeft);
		BSTreeNode *t =  c->m_pLeft;
		c->m_pLeft = c->m_pRight;
		c->m_pRight = t;
	}
}

1、没有判断子节点是否为空,循环不能终止



ANSWER FROM:http://blog.csdn.net/v_july_v/article/details/6870251
This is the basic application of recursion.
PS: I don’t like the m_xx naming convension. 

void swap(Node ** l, Node ** r) {
  Node * p = *l;
  *l = *r;
  *r = p;
}
void mirror(Node * root) {
  if (root == NULL) return;
  swap(&(root->left), &(root->right));
  mirror(root->left);
  mirror(root->right);
}
void mirrorIteratively(Node * root) {
  if (root == NULL) return;
  stack<Node*> buf;
  buf.push(root);
  while (!stack.empty()) {
    Node * n = stack.pop();
    swap(&(root->left), &(root->right));
    if (root->left != NULL) buf.push(root->left);
    if (root->right != NULL) buf.push(root->right);
  }
}



transform
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值