翻转二叉树

发布时间 2023-08-02 17:32:57作者: 小凉拖

思路:
使用层序遍历的方法:
将根节点入队,然后将根节点的左节点和右节点交换,每次for循环都执行“如果左节点不为空则将左节点入队,如果右节点不为空就将右节点入队,队头出队,将队头的左右结点交换,然后队头的左右节点不为空,将队头的左右结点入队。

 1 void ceng(Node* node, vector<vector<int>>& result) {
 2     queue<Node*>qu;
 3     qu.push(node);
 4     Node* temp = node;
 5     int size = 0;
 6     //只有temp为空的情况下采取判断st是否为空
 7     while (!qu.empty()) {
 8         size = qu.size();
 9         vector<int>vec;
10         for (int i = 0; i < size; i++) {
11             temp = qu.front();
12             vec.push_back(temp->data_);
13             qu.pop();
14             if (temp->left) {
15                 qu.push(temp->left);
16             }
17             if (temp->right) {
18                 qu.push(temp->right);
19             }
20         }
21         result.push_back(vec);
22     }
23 }
24 void change(Node* node) {
25     queue<Node*>qu;
26     if (node == nullptr) return;
27     qu.push(node);
28     Node* change;
29     Node* temp;
30     int size = 0;
31     //只有temp为空的情况下采取判断st是否为空
32     while (!qu.empty()) {
33         size = qu.size();
34         for (int i = 0; i < size; i++) {
35             temp = qu.front();
36             qu.pop();
37             change = temp->left;
38             temp->left = temp->right;
39             temp->right = change;
40             if (temp->left) {
41                 qu.push(temp->left);
42             }
43             if (temp->right) {
44                 qu.push(temp->right);
45             }
46         }
47     }
48 }
49 int main() {
50     Node* node1 = new Node(6);
51     Node* node2 = new Node(3);
52     Node* node3 = new Node(9);
53     Node* node4 = new Node(1);
54     Node* node5 = new Node(4);
55     Node* node6 = new Node(8);
56     Node* node7 = new Node(0);
57     node1->left = node2;
58     node1->right = node3;
59     node2->left = node4;
60     node2->right = node5;
61     node3->left = node6;
62     node4->left = node7;
63     vector<vector<int>>result;
64     change(node1);
65     ceng(node1, result);
66     for (auto& v : result) {
67         for (auto& in : v) {
68             cout << in << endl;
69         }
70     }
71 }

前序遍历:
将一个节点的左右结点进行反转,并将该结点的左节点的左右结点进行反转和右节点的左右结点进行反转

 1     TreeNode* invertTree(TreeNode* root) {
 2         if (root == NULL) return root;
 3         stack<TreeNode*> st;
 4         st.push(root);
 5         while(!st.empty()) {
 6             TreeNode* node = st.top();              // 中
 7             st.pop();
 8             swap(node->left, node->right);
 9             if(node->right) st.push(node->right);   // 右
10             if(node->left) st.push(node->left);     // 左
11         }
12         return root;
13     }