zoukankan      html  css  js  c++  java
  • 二叉树遍历 Morris

    二叉树的遍历,先根遍历,不适用递归,存储空间为 O(1)

    转自:http://chuansongme.com/n/100461

    MorrisInOrder():
     while 没有结束
       如果当前节点没有左后代  // 则它就是最左了 所以 读取该点
         访问该节点
         转向右节点
       否则
         找到左后代的最右节点,且使最右节点的右指针指向当前节点  // 形成环,构造等以后读取完 本节点后,转向右节点再度的右节点
         转向左后代节点   // 先处理到左下方向
    void bst_morris_inorder(struct bst_node *root)  {  
       struct bst_node *p = root, *tmp;
       while (p) {  
           if (p->left == NULL) {  
               printf("%d ", p->key);  
               p = p->right;  
           }  
           else {  
          // 找左子节点的 最右方 相当于等以后 递归的处理, 处理完这个 左节点,之后应该处理的 点 tmp
    = p->left; while (tmp->right != NULL && tmp->right != p) tmp = tmp->right; if (tmp->right == NULL) { // 还没设置过,属于第一遍遍历此处的 tmp->right = p; p = p->left; // 继续处理左下方 做第一遍的遍历 } else { // 之前处理过这个位置了 printf("%d ", p->key); // 左边都遍历完了,可以读取根的值了 tmp->right = NULL; // 恢复输入时候的样子 p = p->right; // 转向右节点 } } } }
  • 相关阅读:
    CSS3动画
    Grid布局
    JS向上取整、向下取整、四舍五入等
    JS DOM资料
    关于setInterval和setTimeout中的this指向问题
    JavaScript 高级技巧 Memoization
    请求接口的方式
    HTTP协议知识
    CSS样式重置
    Chrome 为什么使用多进程,不使用多线程
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3896014.html
Copyright © 2011-2022 走看看