层序遍历:

思路:
使用层序遍历的方法:
将根节点入队,然后将根节点的左节点和右节点交换,每次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 void change(Node* node) {
2     if (node == nullptr) return;
3     Node* temp;
4     temp = node->left;
5     node->left = node->right;
6     node->right = temp;
7     change(node->left);
8     change(node->right);
9 }

 

posted on 2023-08-02 17:28  小凉拖  阅读(9)  评论(0编辑  收藏  举报