二叉树生成镜像

  1 #include <stdio.h>
  2 #include <iostream>
  3 #include <set>
  4 #include <unordered_set>
  5 #include <map>
  6 #include <queue>
  7 #include <vector>
  8 #include <string>
  9 #include <stack>
 10
 11 using std::cout;
 12 using std::endl;
 13 using std::set;
 14 using std::map;
 15 using std::queue;
 16 using std::vector;
 17 using std::string;
 18 using std::unordered_set;
 19 using std::stack;
 20 using std::begin;
 21 using std::end;
 22
 23 class TreeNode
 24 {
 25 public:
 26     TreeNode(int v):value(v), left(NULL), right(NULL)
 27     {
 28     }
 29 public:
 30     int value;
 31     TreeNode *left;
 32     TreeNode *right;
 33 };
 34
 35 TreeNode *postorder(TreeNode *root)
 36 {
 37     if (root == NULL)
 38     {
 39         return NULL;
 40     }
 41     TreeNode *right = postorder(root->left);
 42     TreeNode *left = postorder(root->right);
 43     TreeNode *temp = new TreeNode(root->value);
 44     temp->left = left;
 45     temp->right = right;
 46     return temp;
 47 }
 48
 49 TreeNode *postorderNR(TreeNode *root)
 50 {
 51     if (root == NULL)
 52     {
 53         return NULL;
 54     }
 55     stack<TreeNode *> sk;
 56     stack<TreeNode *> sk2;
 57     set<TreeNode *> s;
 58     sk.push(root);
 59     TreeNode *p;
 60     while (sk.size() != 0)
 61     {
 62         p = sk.top();
 63         sk.pop();
 64         if (p->left != NULL && s.count(p->left) == 0)
 65         {
 66             sk.push(p);
 67             sk.push(p->left);
 68         }
 69         else if (p->right != NULL && s.count(p->right) == 0)
 70         {
 71             sk.push(p);
 72             sk.push(p->right);
 73         }
 74         else
 75         {
 76             cout << p->value  << ", ";
 77             s.insert(p);
 78             ////////////////////////
 79             TreeNode *r = new TreeNode(p->value);
 80             if (p->left == NULL && p->right == NULL)
 81             {
 82                 r->left = r->right = NULL;
 83
 84             }
 85             else if (p->left == NULL && p->right != NULL)
 86             {
 87                 r->left = sk2.top();
 88                 sk2.pop();
 89                 r->right = NULL;
 90             }
 91             else if (p->left != NULL && p->right == NULL)
 92             {
 93                 r->left = NULL;
 94                 r->right = sk2.top();
 95                 sk2.pop();
 96             }
 97             else
 98             {
 99                 r->left = sk2.top();
100                 sk2.pop();
101                 r->right = sk2.top();
102                 sk2.pop();
103             }
104             sk2.push(r);
105         }
106     }
107     return sk2.top();
108 }
109 int main(int argc, char **argv)
110 {
111     TreeNode *root;
112     TreeNode n1(1);
113     TreeNode n2(2);
114     TreeNode n3(3);
115     TreeNode n4(4);
116     TreeNode n5(5);
117     TreeNode n6(6);
118     TreeNode n7(7);
119     TreeNode n8(8);
120     n1.left = &n2;
121     n1.right = &n3;
122     n2.left = &n4;
123     n2.right = &n5;
124     n3.left = &n6;
125     n3.right = &n7;
126     n4.left = &n8;
127     root = &n1;
128     TreeNode *result = postorderNR(root);
129
130     getchar();
131     return 0;
132 }

二叉树生成镜像,布布扣,bubuko.com

时间: 2024-11-05 15:08:18

二叉树生成镜像的相关文章

【剑指offer】【树】27.二叉树的镜像

二叉树的镜像 递归法 递归的先序遍历二叉树,交换每个节点的左右子节点,即可生成二叉树的镜像 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNod

二叉树的镜像

什么是二叉树的镜像呢? 我们可以自己画一颗二叉树.然后根据照镜子画出它的镜像. 如: 我们不能一次得到二叉树的镜像,要想得到一颗二叉树的镜像,有以下几个步骤: (1)先交换根的左子树和右子树 (2)交换6的左子树和右子树                      (3)交换10的左子树和右子树 得出以上规律后,就可以写代码喽: class BinaryTreeNode { public: BinaryTreeNode(const T& data) :_data(data) ,_left(NULL

【剑指offer】二叉树的镜像

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25915971 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.C

【剑指offer】十二,二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 分析:镜像的递归定义就是将原有二叉树中节点的左右子树对调.代码如下: 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 public class Solut

剑指Offer 二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 思路: 直接一个中间指针,递归,交换左右节点,节点为叶子节点的时候返回. AC代码: 1 class Solution { 2 public: 3 void Mirror(TreeNode *pRoot) { 4 if(pRoot==NULL) 5 return ; 6 7 TreeNode *

剑指OFFER之二叉树的镜像(九度OJ1521)

题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩子,紧接着是右孩子的编号.C

二叉树的镜像-剑指Offer

二叉树的镜像 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述 二叉树的镜像定义: 源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 思路 递归交换每个节点的左右子树即可 代码 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.v

【javascript】操作给定的二叉树,将其变换为源二叉树的镜像。

操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / 6 10 / \ / 5 7 9 11 镜像二叉树 8 / 10 6 / \ / 11 9 7 5 代码如下: function Mirror(root) { // write code here if(root) { var temp = root.left; root.left = root.right; root.right = temp; Mirror(root.left); Mirror(ro

求二叉树的镜像

求二叉树的镜像: void MirrorBiTree(BiTree* pNode) { if(pNode == NULL||pNode->leftChild ==NULL || pNode->rightChild ==NULL) return ; ListNode* temp; temp = pNode->leftChild; pNode->leftChild  =  pNode->rightChild; pNode->rightChild = temp; if( pN