1、从尾到头逆向打印单链表

  

 1 #include<vector>
 2 
 3 using namespace std;
 4 typedef struct Node{
 5     int num;
 6     struct Node *next;
 7 }ListNode;
 8 
 9 class Solution{
10 public:
11     vector<int> PrintTailtoHead(ListNode* head)
12     {
13         vector<int>res;
14         ListNode *p = head;
15         //每遍历一个元素放入vector容器中,然后逆序输出
16         if (p!=NULL)
17         {
18             res.push_back(p->num);
19             p = p->next;
20         }
21         //res.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素
22         //res.rend(),指向容器的第一个元素的前一个位置
23         return vector<int>(res.rbegin(),res.rend());
24 
25     }
26 };

 

2、前序中序重建二叉树

 1 class Solution{
 2 public:
 3     //记录节点位置
 4     unordered_map<int, int>pos;
 5     TreeNode * ConstructTree(vector<int>pre, vector<int>vin)
 6     {
 7         //一共有多少个节点
 8         int con = pre.size();
 9         for (int i = 0; i < con; i++)
10         {
11             pos[vin[i]] = i;//记录中序的位置
12         }
13         return DFS(pre, vin, 0, con - 1, 0, con - 1);
14     }
15     TreeNode *DFS(vector<int>pre, vector<int>vin, int pl, int pr, int vl, int vr)
16     {
17         if (pl>pr) return NULL; //叶子
18         //根节点
19         TreeNode *root = new TreeNode(pre[pl]);
20         //左子树长度
21         int k = pos[vin[pl]] - vl;
22 
23         root->left = DFS(pre, vin, pl + 1, pl  + k, vl, vl + k-1);
24         root->right = DFS(pre, vin, pl + k + 1, pr, vl + k + 1, vr);
25 
26         return root;
27     }
28 };

3、找出某个节点的中序遍历顺序的下一个节点

  case1:如果该节点有右子树,则其下一个节点是其右子树的最左边的节点;例如F

  case2:  如果该节点没有右子树,1)该节点如果是根节点,则没有后继节点;

                2)该节点是其父节点的左孩子,后继节点为其父节点;例如H

                3)该节点是其父节点的右孩子,向上找,找到第一个是左子节点的父节点,这个父节点的父节点就是其后继节点,例如D,如果找不到,说明没有后继节点,例如G

 

 1 struct TreeNode
 2 {
 3     int val;
 4     struct TreeNode *left, *right, *parent;
 5 };
 6 class Solution{
 7 public:
 8     TreeNode *FindNext(TreeNode*p)
 9     {
10         //case1 右子树存在
11         if (p->right)
12         {
13             p = p->right;
14             while (p->left)
15             {
16                 p = p->left;
17             }
18             return p;
19         }
20         //case 2 右子树不存在
21         //不是根节点
22         while (p->parent)
23         {
24             if (p = p->parent->left)
25                 return p->parent;
26             p = p->parent;
27         }
28         return NULL;
29 
30     }
31 
32 }